如何使用mongo聚合遍历数组并返回所需的文档?

时间:2019-02-17 16:27:09

标签: javascript node.js mongodb mongoose aggregation-framework

我有一个查询,需要在其中按ID查找文档,然后只需要返回数组中符合特定条件的项目。

在下面的代码中,您将看到我只需要按ID“匹配”一个文档,然后我将一个“限制”设为一个(应该只有一个)。这是我真的很困惑的地方...我然后“展开”数组的 fragments 字段,数组内部是子文档。我需要通过其中的数组的最后一项过滤掉这些子文档,因此我“投影”了 assignments_array 的“切片”。这是我只需要B为空或assignments_array为空的文档

assignment_history.to

这给我这个结果...

db.getCollection('territories').aggregate([
    {
      "$match": {
        "congregation": ObjectId("5c68c706f1f52047f08862b3")
      }
    },
    {
      "$limit": 1
    },

    { 
      $unwind: {
        path: "$fragments"
      }
    },
    {
      $project: {
        "fragments.number": 1,
        "fragments.assignment_history": {"$slice": ["$fragments.assignment_history", -1]}
      }
    }

我需要结束于2个对象,其中{ "_id": ObjectId("5c68c706f1f52047f08862b6"), "fragments": { "number": 1, "assignment_history": [{ "to": ObjectId("5c68c706f1f52047f08862b4"), "on": 1550370567067 }] } } { "_id": ObjectId("5c68c706f1f52047f08862b6"), "fragments": { "number": 2, "assignment_history": [] } } { "_id": ObjectId("5c68c706f1f52047f08862b6"), "fragments": { "number": 3, "assignment_history": [{ "to": null, "on": 1550370567067 }] } } 为空,而assignment_history.to没有项目/长度。

2 个答案:

答案 0 :(得分:1)

您可以在$match之后再使用一种$unwind条件

db.getCollection('territories').aggregate([
  { "$match": { "congregation": ObjectId("5c68c706f1f52047f08862b3") }},
  { "$limit": 1 },
  { "$unwind": { "path": "$fragments" }},
  { "$match": {
    "$or": [
      { "fragments.assignment_history.to": null },
      { "fragments.assignment_history.to": { "$exists": false }}
    ]
  }},
  { "$project": {
    "fragments.number": 1,
    "fragments.assignment_history": { "$slice": ["$fragments.assignment_history", -1] }
  }}
])

答案 1 :(得分:0)

尝试在项目之前添加此阶段。 它的意思是给我那些fragments.assignment_history为空的人, 或没有fragments.assignment_history.to

的广告
{
  $match: {
     $or : [
            { "fragments.assignment_history" : {$size: 0}},
            { 
              "fragments.assignment_history" :{
                        $not: { $elemMatch: { to : {$exists: true} } 
              }
            }
           ]
  }
}