【问题标题】:Mongodb .aggregate not matching $or?Mongodb .aggregate 不匹配 $or?
【发布时间】:2014-10-03 21:27:45
【问题描述】:

无论用户发送或接收消息,他/她都应该能够为他/她自己存档消息。

但是,此 .aggregate $or 仅返回用户是 ('to') 的接收者且他/她已标记为 'archive':'true' 的文档。它确实根据“值”布尔值准确过滤消息。

Models.Messages.aggregate([

    // Match documents
    { "$match": {
      "$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 } 
             ]
    }},

    // Unwind to de-normalize
    { "$unwind": "$to" },
    { "$unwind": "$from" },

    // Match the array elements      
    { "$match": {
       "to.username": 'userA',
       "to.view.archive": true,
       "from.username": 'userA',
       "from.view.archive": true
    }},

    // Group back all the elements of the original document
    { "$group": {
       "_id": "$_id",
       "from": { "$push": "$from" },
       "to": { "$push": "$to" },
       "message": { "$first": "$message" },
       "updated": { "$first": "$updated" }
    }},

    // Sort by updated, most recent first (descending)
    {"$sort": {"updated": -1}}

], function (err, docs) {

如何改变这一点,以便为 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
}

【问题讨论】:

  • 这条语句中“messagingQuery”变量的内容是什么?非常类似的问题已在另一个用户帐户下发布。你是同一个人吗?同事?还是只是想为这些问题寻找答案?
  • 您的 $or 对象中似乎有两个 $or 字段,这是无效的。如果它们都需要满足,则需要将它们包装在 $and 数组中。
  • @NeilLunn 消息查询现在已替换为查询详细信息。 Stack 是我以前的帐户,我刚开始编程时就开始使用它,我决心在未来提出更好的问题......所以我重新开始。
  • @JohnnyHK 谢谢。它看起来像这样吗.. $or:[ $and: [ {to:..}{from:..} ] {value:..} ]

标签: mongodb mongoose


【解决方案1】:

您的第一个 $match 对象的顶层不能有两个 $or 字段,因此如果它们都需要满足,则需要将它们包装在一个 $and 数组中,如下所示:

{ "$match": { 
  $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 } 
           ]
    }
  ]
}}

您的管道中有很多事情要做,所以这可能不是唯一的问题。

【讨论】:

  • 再次感谢您。由于某种原因,结果仍然不包括 $from 结果,所以它可能是管道中的其他东西..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 2013-01-29
  • 2011-10-01
相关资源
最近更新 更多