Node.js Mongoose/MongoDB聚合-$match$解绑$match不工作?

Node.js Mongoose/MongoDB聚合-$match$解绑$match不工作?,node.js,mongodb,if-statement,mongoose,aggregation-framework,Node.js,Mongodb,If Statement,Mongoose,Aggregation Framework,如何将此存档视图聚合更改为同时聚合from.view.archive:true ..同时防止聚合重复消息..如果To数组中存在From用户(sessionUser),则仅获取此消息中的一条 if (archive === true) { console.log('archive === ' + true); Models.Message.aggregate([ // Match documents { "$match": { "to": {

如何将此存档视图聚合更改为同时聚合from.view.archive:true

..同时防止聚合重复消息..如果To数组中存在From用户(sessionUser),则仅获取此消息中的一条

 if (archive === true) {
  console.log('archive === ' + true);

  Models.Message.aggregate([

     // Match documents
     { "$match": {
          "to": { 
              "$elemMatch": {
                 "username": req.session.username,
                 "view.archive": true,
                 "view.bin": false
              }
          },
          "$or": messagingquery
     }},

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

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

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

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

  ], function (err, messages) {

    if (err) {
      console.log(err);
      res.send(err);
    }

    res.json({
      messages : messages,
      sessionUser: sessionUser
    });

  });

}
MesageSchema的From和To数组的UserMessageSchema如下所示:

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

我觉得我一定是误解了某些情况,但听起来你应该能够在第一场比赛中添加一个简单的
$或

{ "$match": {
    "$or" : [
        {
            "to": { 
                  "$elemMatch": {
                      "username": req.session.username,
                      "view.archive": true,
                      "view.bin": false
                  }
            }
        },
        {
            "from" : {
                "$elemMatch" : {
                    "username" : req.session.username,
                    "view.archive": true,
                }
            }
        }
    ],
        "$or": messagingquery
 }}

$match
阶段不能产生复制,因为
$match
根据条件筛选文档。重复从何而来?如何准确定义“重复”?

非常感谢您的回答。$or是否获取与to.view.archive匹配的所有文档:true以及与from.view.archive匹配的所有文档:true?这会不会导致res.json({messages})中出现多个相同的文档;如果一个文档符合这两个条件?每个文档只能在结果列表中显示一次。如果您有一个带有{a:[1,2,3]}的文档,并且您查询a为1、a为2或a为3的所有文档,那么即使它匹配所有三个or'ed条件,您也只能返回一个文档。是否必须修改$unwind阶段、第二个$match阶段或$group阶段?仍然没有从中检索任何内容…第二个$match阶段应该与第一个相同-您必须同时更改这两个阶段。@AsyaKamsky谢谢。。这应该包括美元还是美元?就像字面上一样?那么美元的放松呢?