如何根据 Mongo 中集合中的布尔值有条件地查询密钥

How to conditionally query keys based on boolean in collection in Mongo

本文关键字:有条件 查询 密钥 布尔值 集合 何根 Mongo      更新时间:2023-09-26

我有一个项目集合。

结构示例:

{
    "_id" : "56bb6c33efedf80e0e01596b",
    "name" : "Item1",
   "price" : 102,
   "category" : "food",
   "date" : { ... },
   "description" : "Description",
   "__v" : 0
}

date可以是两件事之一

1.

date : {
     "day_of_week" : "wednesday",
     "weekly" : true
 }

阿拉伯数字。

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)
})

所以我坚持尝试根据布尔值weekly查询以分隔date对象中的键。

任何帮助将不胜感激。

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

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

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

如果您不执行任何其他聚合,则作为查询会更简单、更快捷。