MongoDB:如何做$或用$ where(它没有做逻辑OR)

时间:2014-03-31 10:30:23

标签: mongodb mongodb-query

我们如何使用$或使用这样的$ where子句?

此查询应始终返回所有记录(因为2015年的日期),但它不会返回任何内容。

在某些部分,它可以正常工作,但在尝试应用$或者Date或$ where时,它无法正常工作。

感谢Sammaye将我以前的版本修复到以下版本(但仍然没有工作):

db.turnys.find({
       $or:[
            { start:{
               $lte:new Date("2015-03-31T09:52:29.338Z")
            } },
            { $where:"this.users.length == this.seats" }
       ]
});

如何完成预期的$或?

以下是turnys集合的示例:

db.turnys.find({
       $or:[
            { start:{
               $lte:new Date("2015-03-31T09:52:29.338Z")
            } },
            { $where:"this.users.length == this.seats" }
       ]
});

谢谢!

2 个答案:

答案 0 :(得分:0)

问题是$or不能那样工作,实际上你需要的是:

db.turnys.find({
   $or:[
        { start:{
           $lte:new Date("2015-03-31T09:52:29.338Z")
        } },
        { $where:"this.users.length == this.seats" }
   ]
});

现在将创建一个包含两个子句的$or查询。 $or数组的每个元素都被归类为$and ed子句。

答案 1 :(得分:0)

当我在other question上引用您时,应避免使用$where运算符 ,如下所示。

再次显示你应该做的是"分配"文档中的total_users值,使用$ inc运算符进行更新。但是你的"查询"应该使用.aggregate()

看起来像这样
db.collection.aggregate([
    { "$project": {
        "gId": 1,
        "start": 1,
        "alloc": { "$eq": [ "$total_users", "$seats" ] }
    }},
    { "$match": {
        "$or": [ 
           { "alloc": 1, },
           { "start": { "$lte": new Date("2015-03-31T09:52:29.338Z") } }
        ]
    }}
])

甚至可能使用"数组大小"在MongoDB中提到的更多最近版本(仍将在撰写时发布)中提到的表单。

但也要"澄清"你需要确保你的"测试"操作实际上是有效的。