如何在Mongo中基于集合中的boolean有条件地查询键

时间:2016-02-10 17:56:14

标签: javascript mongodb date

我有一系列物品。

示例结构:

{
    "_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对象中的单独键。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

$cond运算符不能在$match中使用,因为只允许查询运算符,如下面的注释中所述。

如果您的数据是一致的,因为所有$date.weekly布尔值都告诉您日期子文档中存在的键,那么一个简单的$or可能会处理它:

{ $or: [ { date.day_of_week: 'wednesday' },{ date.start_date: '20150121' } ] }

如果您没有执行任何其他聚合,那么作为查询会更加简单和快捷。