Node.js 如何在Mongoose/MongoDb中传递可选参数

Node.js 如何在Mongoose/MongoDb中传递可选参数,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有以下疑问: Documents.find({ $and: [ { user_id: {$nin: myUserId } }, { date: { $gte: dateMax, $lt: dateMin } }, {documentTags: {$all: tags}} ], }) 我试图做的是使查询的documentTags部分成为可选的。我已尝试按如下方式构建查询:

我有以下疑问:

Documents.find({
    $and: [
      {
        user_id: {$nin: 
          myUserId
        }
      },
      { date: { $gte: dateMax, $lt: dateMin } },
      {documentTags: {$all: tags}}
    ],
  })
我试图做的是使查询的documentTags部分成为可选的。我已尝试按如下方式构建查询:

let tags = " ";
    if (req.body.tags) {
        tags = {videoTags: {$all: req.body.tags}};
    }

let query = {
        $and: [
          {
            user_id: {$nin: 
              myUserId
            }
          },
          { date: { $gte: dateMax, $lt: dateMin } },
          tags
        ],
      }
然后是
文档。查找(查询)
。问题是,无论我如何修改标记(无论是未定义的标记、空白标记还是其他标记),我都会遇到各种错误,如
$或/$和/$或条目必须是完整对象
类型错误:无法读取未定义的
的属性“hasOwnProperty”

有没有办法将可选需求构建到查询中

我尝试了下面的选项,查询只返回与其他字段匹配的所有内容。出于某种原因,它不是按标签过滤的。我做了一个
console.log(queryArr)
console.log(query)
分别得到以下信息:

[
  { user_id: { '$nin': [Array] } },
  {
    date: {
      '$gte': 1985-01-01T00:00:00.000Z,
      '$lt': 2020-01-01T00:00:00.000Z
    }
  },
  push: { documentTags: { '$all': [Array] } }
]
console.log(查询)


你就快到了。相反,您可以在查询外部构造对象,并在完成后将构造的查询放入
$和

let queryArr = [
                 {
                    user_id: {$nin: myUserId}
                 },
                 { date: { $gte: dateMax, $lt: dateMin } }
               ];

    if (req.body.tags) {
        queryArr.push({videoTags: {$all: req.body.tags}});
    }

let query = {
        $and: queryArr
      }

现在,您可以通过将对象推入查询数组本身来控制查询。

我找到了它不起作用的原因。基本上,当您执行
myVar.push
时,它会创建一个
键值对
,例如
[1,2,3,push:value]
。如果您需要以这种格式附加一个k-v对,这将是可行的,但是在像我这样的查询中使用它会有困难。对我来说,正确的方法是使用
conact
,它
仅使用您设置的值来附加数组,而不是使用k-v对

if (req.body.tags){
    queryArgs = queryArgs.concat({documentTags: {$all: tags}});
}
let query = {
    $and: queryArgs
}

我原以为它能工作,但后来我打印了queryArr的值来控制,出于某种原因,所有变量都被保存为
[object]
。我已经更新了我的问题以显示args中的数据,当然Mongo没有返回正确的信息
if (req.body.tags){
    queryArgs = queryArgs.concat({documentTags: {$all: tags}});
}
let query = {
    $and: queryArgs
}