Concat并在整个集合中获取所有匹配的嵌套数组

时间:2017-10-12 12:41:30

标签: mongodb aggregation-framework

我有疑问,在数据库中我有模型:

board.model.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var BoardSchema = new Schema({
  name: { type: String, maxlength: 20 },
  lists : { type: Array },
  users : [{ type : Schema.Types.ObjectId, ref: 'User' }],    
});

module.exports = mongoose.model('Board', BoardSchema);

列表内添加阵列卡。 在实践中它看起来像这样:

{
    "_id" : ObjectId("59df60fb6fad6224f4f9f22a"),
    "name" : "1",
    "users" : [ 
        ObjectId("59cd114cea98d9326ca1c421")
    ],
    "lists" : [ 
        {
            "list" : "1",
            "cards" : [ 
                {
                    "name" : "1",
                    "Author" : [ 
                     ObjectId("59df60fb6fad6224f4f9f22a")
                    ],
                }, 
                {
                    "name" : "2" 
                }, 
                {
                    "name" : "3" 
                }
            ]
        }, 
        {
            "list" : "2",
            "cards" : [ 
                {
                    "name" : "1",
                    "Author" : [ 
                     ObjectId("59df60fb6fad6224f4f9f22a")
                    ],
                }, 
                {
                    "name" : "2",
                    "Author" : [ 
                     ObjectId("59df60fb6fad6224f4f9f22a")
                    ],
                }, 
                {
                    "name" : "3" 
                }
            ]
        } 
    ],
    "__v" : 0
}

好的,这是一个板子的例子,问题是我可以只拉出作者是“作者”的牌:所有板子的ObjectId(“59df60fb6fad6224f4f9f22a”)?

1 个答案:

答案 0 :(得分:0)

您可以在3.4中尝试以下聚合。

在每个棋盘中跟随所有匹配的($filter)卡片,然后按$unwind并推送以收集所有卡片。

故障:

$reduce将单个文档中的所有卡阵列连接起来。

$filter使用$$thiscards数组)参数和过滤器来匹配卡片,$$value保留以前的值。

$concatArrays将先前的值与当前过滤的值合并。

$unwind解析卡阵列,$group解析$push以获取所有卡片阵列。

db.collection.aggregate([
  {
    "$project": {
      "boardcards": {
        "$reduce": {
          "input": "$lists.cards",
          "initialValue": [],
          "in": {
            "$concatArrays": [
              "$$value",
              {
                "$filter": {
                  "input": "$$this",
                  "as": "result",
                  "cond": {
                    "$eq": [
                      "$$result.Author",
                      ObjectId("59df60fb6fad6224f4f9f22a")
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    "$unwind": "$boardcards"
  },
  {
    "$group": {
      "_id": null,
      "allboardcards": {
        "$push": "$boardcards"
      }
    }
  }
])

根据评论中的要求,只需获取卡片的名称,您必须将$filter运算符中的$map包裹到地图卡名称中。

所以用$filter + $map

替换$filter
{
  "$map": {
    "input": {
      "$filter": {
        "input": "$$this",
        "as": "result",
        "cond": {
          "$eq": [
            "$$result.Author",
           ObjectId("59df60fb6fad6224f4f9f22a")
          ]
        }
      }
    },
    "as": "result",
    "in": {
      "name": "$$result.name"
    }
  }
}