Mongodb .aggregate不匹配$或?

时间:2014-08-11 06:01:54

标签: mongodb mongoose

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

这个.aggregate $或者只返回用户是他/她已经标记为':'的':':'真正的&#39 ;.它确实根据'值准确过滤邮件。布尔。

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
}

1 个答案:

答案 0 :(得分:1)

您的第一个$or对象的顶层不能包含两个$match字段,因此您需要将这些字段包含在$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 } 
           ]
    }
  ]
}}

你的管道中有很多事情发生,所以这可能不是唯一的问题。