MongoDB 过滤 Node.JS 中的嵌套数组

MongoDB Filter Nested Array in Node.JS

我在 MongoDB 中有一个看起来像这样的集合:

[
  {
    "machine": 1,
    "status": true,
    "comments": [
      {
        "machine": 1,
        "status": false,
        "emp": "158",
        "comment": "testing the latest update"
      },
      {
        "machine": 1,
        "status": false,
        "emp": "007",
        "comment": "2nd comment"
      },
    ]
  },
  {
    "machine": 2,
    "status": true,
    "comments": [
      {
        "machine": 2,
        "status": true,
        "emp": "158",
        "comment": "checking dcm 2"
      }
    ]
  }
]

我想 return 所有顶级文档(机器 1 和 2),但只有 emp“007”的评论。我也只想return最新的评论,不是全部。我让那部分与这条线一起工作:

await db.collection('status').find().project( { "comments": { "$slice": -1 } }).toArray()

但我终其一生都无法通过嵌套数组中的 'emp' 进行过滤。

db.collection.aggregate([
  {
    $match: {
      "comments.machine": {
        $in: [
          1,
          2
        ]
      },
      "comments.emp": "007"
    }
  },
  {
    "$addFields": {//addFields with same name overwrites the array
      "comments": {
        "$filter": { //Filter the array elements based on condition
          "input": "$comments",
          "as": "comment",
          "cond": {
            $eq: [
              "$$comment.emp",
              "007"
            ]
          }
        }
      }
    }
  }
])

Playground

如果您有日期,请按日期排序并获得前一个。

您可以使用 $filter 的简单聚合来获得干净的输出:

db.collection.aggregate([
  {
    $project: {
      machine: 1,
      status: 1,
      comments: {
        $slice: [
          {
            $filter: {
              input: "$comments",
              as: "item",
              cond: {$eq: ["$$item.emp", "007"]}}
          }, -1
        ]
      },
      _id: 0
    }
  },
  {$set: {comments: {$arrayElemAt: ["$comments", 0]}}},
])

Playground example