Mongodb .aggregate满足$ match,但排除不匹配的嵌入式文档?

时间:2014-08-11 03:12:44

标签: mongodb mongoose

我想只聚合其中' sessionUsername'是在'到'他/她还将他/她的消息视图设置为view.inbox:true& view.archive:false& view.bin:假..

(满足这些参数的文档通过$或messagingQuery进一步过滤)

为什么生成的文档会排除'到'中存在的任何其他用户的值。阵列吗

我有一个嵌入式文档的架构结构,如下所示:

var MessageSchema = new Schema({
    from      : [UserMessageSchema],
    to        : [UserMessageSchema],
    message   : String,
    updated   : Date
});

var UserMessageSchema = new Schema({
  user        : { "type": Schema.ObjectId, "ref": "User" },
  username    : String,
  view : {
    inbox       : Boolean,
    outbox      : Boolean,
    archive     : Boolean,
    bin         : Boolean
  }
    updated   : Date
});

以及如下所示的聚合查询:

Models.Messages.aggregate([

    // Match documents
    { "$match": {
        "to": { 
            "$elemMatch": {
               "username": sessionUsername,
               "view.inbox": true,
               "view.archive": false,
               "view.bin": false
            }
        },
        "$or": messagingQuery
    }},

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

    // Match the array elements      
    { "$match": {
       "to.username": sessionUsername,
       "to.view.inbox": true,
       "to.view.archive": false,
       "to.view.bin": false
    }},

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

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

], function (err, docs) {

1 个答案:

答案 0 :(得分:0)

感谢@NeilLunn指出答案:在$ unwind之后,第二个$匹配排除了不匹配第二个$ match的字段。

这是一个find():

Models.Messages.find(
   { 
        "to": { 
            "$elemMatch": {
               "username": sessionUsername,
               "view.inbox": true,
               "view.archive": false,
               "view.bin": false
            }
        },
        "$or": messagingQuery
   }
).sort([['updated','descending']]).exec(function (err, docs) {