Javascript 如果值为null,则Mongoose忽略find中的列

Javascript 如果值为null,则Mongoose忽略find中的列,javascript,mongoose,Javascript,Mongoose,假设我得到了一个猫鼬模型和一个基于机会的值 const findUser=async(用户名、电子邮件)=>{ 设foo=null 如果(Math.random()>0.5)foo=“hi”//`foo`现在有机会从null变为“hi” UserModel.find({“username”:username,“email”:email,“winner”:foo===null?”排除此搜索值:foo } ^这是一些真实的代码,结合了一些伪代码^ 我可以这样做: const findUser=as

假设我得到了一个猫鼬模型和一个基于机会的值

const findUser=async(用户名、电子邮件)=>{
设foo=null
如果(Math.random()>0.5)foo=“hi”//`foo`现在有机会从null变为“hi”
UserModel.find({“username”:username,“email”:email,“winner”:foo===null?”排除此搜索值:foo
}
^这是一些真实的代码,结合了一些伪代码^

我可以这样做:

const findUser=async(用户名、电子邮件)=>{
设foo=null
如果(Math.random()>0.5)foo=“hi”//`foo`现在有机会从null变为“hi”
让结果;
如果(foo==null)
结果=wait UserModel.find({“username”:username,“email”:email});
其他的
结果=等待UserModel.find({“用户名”:用户名,“电子邮件”:电子邮件,“获胜者”:foo});
//^^现在我必须重新键入相同的内容。。
//我想知道是否有一种方法可以有条件地包含它?
}

但这里的问题是,我必须再次键入相同的内容,只是为了包含另一个字段。是否有一种方法可以在搜索中有条件地包含一列?

可能有一种更简单/更好的方法来实现这一点,但在这种情况下,我会做的事情是构建这样的对象

const findUser = async (username, email) => {
  let foo = null

  let query = {
   username,
   email
  }
 
  if (Math.random() > 0.5) foo = "hi" // `foo` now has a chance of turning from null to "hi"

  if (foo != null) {
    query.winner = foo;
  }

  UserModel.find(query);
}


基本上,创建一个默认对象,其中包含您的属性,该对象将始终存在。然后检查您的foo值是否为null。如果不为null,则将其添加到查询中,并将该查询对象传递给find。

您可以将查询提取到变量,然后根据
foo
的值对其进行操作

const findUser = async (username, email) => {
   let foo = null

   if (Math.random() > 0.5) foo = "hi"

   const query = { username, email }

   if (foo) {
      query.winner = foo
   }

   const result = await UserModel.find(query)
}