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
}