【问题标题】:MongoDB .find with multiple $or statements, syntax error 'unexpected token ]'?MongoDB .find 有多个 $or 语句,语法错误“意外令牌]”?
【发布时间】:2014-08-14 00:56:50
【问题描述】:

用户可以发送或接收消息,并且无论如何都应该能够归档他/她的消息。

因此,此 .find 应返回 userAto.usernamefrom.username 中的任何文档,并带有 view.archive:true。从那里,第二个 $or 应该过滤第一个 $or 的结果,只包含消息为 value.1:truevalue.2:truevalue.3:true 的匹配文档

然而,现在,第一个 $or 上的结束 ] 是 SyntaxError: Unexpected token ]

Models.Messages.find(
   { 
        "$or" : [
            {
                "to": { 
                      "$elemMatch": {
                          "username": 'userA',
                          "view.archive": true,
                          "view.bin": true
                      }
                }
            },
            {
                "from" : {
                    "$elemMatch" : {
                      "username" : 'userA',
                      "view.archive": true,
                      "view.bin": true
                    }
                }
            }
        ],
      "$or": [
               { 'value.1': true },
               { 'value.2': true },
               { 'value.3': true },
               { 'value.4': false } 
             ]
   }
).sort([['updated','descending']]).exec(function (err, messages) {

应该为 userA 找到这两条消息:

{
    "_id" : ObjectId("53e83867f316ea7f22fd3b2b"),
    "updated" : ISODate("2014-08-11T03:29:06.000Z"),
    "message" : "message1",
    "value" : [
                "1" : true,
                "2" : false,
                "3" : false,
                "4" : false
            ]
    "to" : [ 
        {
            "user" : ObjectId("53e835bd76e0d04318d8cc4e"),
            "username" : "userA",
            "_id" : ObjectId("53e83867f316ea7f22fd3b2c"),
            "view" : {
                "inbox" : false,
                "outbox" : false,
                "archive" : true,
                "bin" : false
            }
        }
    ],
    "from" : [ 
        {
            "user" : ObjectId("53e8360276e0d04318d8cc55"),
            "username" : "userB",
            "_id" : ObjectId("53e83867f316ea7f22fd3b2d"),
            "view" : {
                "inbox" : false,
                "outbox" : true,
                "archive" : false,
                "bin" : false
            }
        }
    ],
    "__v" : 5
}
{
    "_id" : ObjectId("53e83867f316ea7f22fd3b2b"),
    "updated" : ISODate("2014-08-11T03:29:06.000Z"),
    "message" : "message2",
    "value" : [
                "1" : false,
                "2" : true,
                "3" : false,
                "4" : false
            ]
    "to" : [ 
        {
            "user" : ObjectId("53e8360276e0d04318d8cc55"),
            "username" : "userB",
            "_id" : ObjectId("53e83867f316ea7f22fd3b2c"),
            "view" : {
                "inbox" : true,
                "outbox" : false,
                "archive" : false,
                "bin" : false
            }
        }
    ],
    "from" : [ 
        {
            "user" : ObjectId("53e835bd76e0d04318d8cc4e"),
            "username" : "userA",
            "_id" : ObjectId("53e83867f316ea7f22fd3b2d"),
            "view" : {
                "inbox" : false,
                "outbox" : true,
                "archive" : true,
                "bin" : false
            }
        }
    ],
    "__v" : 5
}

【问题讨论】:

  • 您忘记在 $or 过滤器之前添加 $and
  • 您仍然(不正确地)使用多个 $or 字段,就像在您的 previous question 中一样。我的回答没有意义吗?
  • @JohnnyHK 你的回答很有意义..谢谢。结果仍然排除了 $from 结果,所以它可能还有其他东西在管道中。所以我决定尝试使用 .find 代替,但认为 $and 隐含在 .find 中
  • @soulcheck 感谢您指出这一点.. 的印象是 $and 隐含在 .find 中

标签: mongodb mongoose


【解决方案1】:

感谢@JohnnyHK 对this question 的回答,因为它也适用于这里。

在 MongoDB 中的印象是 $and 隐含在 .find 中,但是当组合 $or 过滤器时,它似乎是必要的,正如@soulcheck 所指出的那样。

Models.Messages.find(
   { 
          $and: [{
            "$or" : [
                {
                    "to": { 
                          "$elemMatch": {
                              "username": 'userA',
                              "view.archive": true,
                              "view.bin": false
                          }
                    }
                },
                {
                    "from" : {
                        "$elemMatch" : {
                            "username" : 'userA',
                          "view.archive": true,
                          "view.bin": false
                        }
                    }
                }
            ]}, {
            "$or": [
                     { 'value.1': true },
                     { 'value.2': true },
                     { 'value.3': true },
                     { 'value.4': false } 
                   ]
            }
          ]
   }
).sort([['updated','descending']]).exec(function (err, messages) {

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2019-10-28
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2017-12-15
    相关资源
    最近更新 更多