MongoDB:如何使用$where执行$or(它不执行逻辑or)

MongoDB:如何使用$where执行$or(它不执行逻辑or),mongodb,mongodb-query,Mongodb,Mongodb Query,我们如何将$or与这样的$where子句一起使用 此查询应始终返回所有记录(因为日期为2015年),但不返回任何内容 在某些情况下,它是有效的,但当尝试将$or应用于日期或$where时,它并没有按预期工作 感谢Sammaye修复了我以前的版本,但仍无法正常工作: 我如何完成预期的$or 以下是turnys系列的示例: [ { “gId”:“5335e4a7b8cf51bcd054b423”, “席位”:2, “开始”:“2014-03-31T08:47:48.946Z”, “结束”:“20

我们如何将$or与这样的$where子句一起使用

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

在某些情况下,它是有效的,但当尝试将$or应用于日期或$where时,它并没有按预期工作

感谢Sammaye修复了我以前的版本,但仍无法正常工作:

我如何完成预期的$or

以下是turnys系列的示例:

[
{
“gId”:“5335e4a7b8cf51bcd054b423”,
“席位”:2,
“开始”:“2014-03-31T08:47:48.946Z”,
“结束”:“2014-03-31T08:49:48.946Z”,
“rMin”:800,
“rMax”:900,
“用户”:[],
_id:“53392bb42b70450000a834d8”
},
{
“gId”:“5335e4a7b8cf51bcd054b423”,
“席位”:2,
“开始”:“2014-03-31T08:47:48.946Z”,
“结束”:“2014-03-31T08:49:48.946Z”,
“rMin”:1000,
“rMax”:1100,
“用户”:[],
_id:“53392bb42b70450000a834da”
},


谢谢!

问题在于,
$或
s不是这样工作的,实际上您需要的是:

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

现在,这将创建一个带有两个子句的
$或
查询。
$或
数组的每个元素都被归类为
$和
ed子句。

正如我在您的上提到的,应该避免使用操作符,如给出的原因所示

同样,如图所示,您应该在更新时使用$inc操作符在文档中“分配”一个
总用户数
值。但是,您的“查询”应该如下所示:

或者甚至可能使用MongoDB的更新版本(截至撰写时仍将发布)中提到的“数组大小”形式


但是,为了“澄清”,您需要确保您的“测试”操作实际上是有效的。

显示一些文档如何?可能的重复不是如何格式化$or查询,实际上是一个带有$and的$or子句,当我在mongo shell中尝试此操作时(在用真正的gId替换gId后,我得到:JavaScript执行失败:语法错误:意外标记非法任何想法?除了shell之外,我可以使用什么工具?@mylord No.$project,值为
1
表示“包括”这个字段。所以你可以使用
1
来表示
true
,或者在这个字段中,你实际上只使用了
$gId
Oops中的字段值。首先,我需要添加总用户数。我想+1,但仍然不能:/@mylord Point是,除了逻辑中可能存在的任何其他问题之外,你不应该接受$where的用法(我已经指出了这一点)因为这对您的应用程序来说不是个好消息。请首先解决您的一般选择问题。并遵循处理数组长度和比较的建议用法。@mylord抱歉,我没有回来,有点忙,很高兴听到它起作用:)
[
  {
    "gId": "5335e4a7b8cf51bcd054b423",
    "seats": 2,
    "start": "2014-03-31T08:47:48.946Z",
    "end": "2014-03-31T08:49:48.946Z",
    "rMin": 800,
    "rMax": 900,
    "users": [],
    "_id": "53392bb42b70450000a834d8"
  },
  {
    "gId": "5335e4a7b8cf51bcd054b423",
    "seats": 2,
    "start": "2014-03-31T08:47:48.946Z",
    "end": "2014-03-31T08:49:48.946Z",
    "rMin": 1000,
    "rMax": 1100,
    "users": [],
    "_id": "53392bb42b70450000a834da"
  },
db.turnys.find({
   $or:[
        { start:{
           $lte:new Date("2015-03-31T09:52:29.338Z")
        } },
        { $where:"this.users.length == this.seats" }
   ]
});
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") } }
        ]
    }}
])