我有一系列物品。
示例结构:
{
"_id" : "56bb6c33efedf80e0e01596b",
"name" : "Item1",
"price" : 102,
"category" : "food",
"date" : { ... },
"description" : "Description",
"__v" : 0
}
其中date
可以是两件事之一
1
date : {
"day_of_week" : "wednesday",
"weekly" : true
}
2
date : {
"end_date" : "20150122",
"start_date" : "20150121",
"weekly" : false
}
date
对象基于weekly
布尔值。
我的问题是,我如何形成我的查询以搜索两种类型的日期对象?我想首先检查每周布尔值是真还是假,然后根据它查询日期。我已经尝试了下面的代码,将它分成两个独立的条件,但我似乎无法正确格式化条件。
Item.aggregate([
{
$match: {
'price': {
'$gt' : 0 ,
'$lt' : 200
},
'category' : food,
'date.day_of_week': {
'$cond': [
$date.weekly,
'wednesday',
null
]
},
'date.start_date': {
'$cond': [
$date.weekly,
null,
20150121
]
}
}
}], function(err, deals) {
console.log(err, deals)
res.send(deals)
})
所以我坚持尝试根据date
布尔值来查询weekly
对象中的单独键。
非常感谢任何帮助。
答案 0 :(得分:2)
$cond
运算符不能在$match
中使用,因为只允许查询运算符,如下面的注释中所述。
如果您的数据是一致的,因为所有$date.weekly
布尔值都告诉您日期子文档中存在的键,那么一个简单的$or
可能会处理它:
{ $or: [ { date.day_of_week: 'wednesday' },{ date.start_date: '20150121' } ] }
如果您没有执行任何其他聚合,那么作为查询会更加简单和快捷。