AddField object 数组使用聚合

AddField an array of object using Aggregate

假设我想从我的 collection 得到一个 object,然后到这个 object,我想添加一个 属性 来存储一个数组object 包含与我的 object(在我的案例系列中)的 属性 之一匹配的 ID 和标题。

示例 object 作为我初始查询的结果

{
   _id: 13123123123,
   title: "TitleofObject",
   series: "SeriesName",
}

然后我想查看相同的 collection,其中系列名称与我的 object 相同(添加一个名为 sameSeries 的新 属性 来存储 object s 匹配系列)和 object 的最终结果应该看起来像这样

    _id: 13123123123,
   title: "TitleofObject",
   series: "SeriesName",
   sameSeries: 
    [
      {
      _id: 12312312,
      title: "anothertitleofObject"
      }, 
      {
      _id: 12312342312,
      title: "anothertitleofObject2"
      }
    ]
   

如何使用聚合方法实现此目的?


 const book = await Book.aggregate([
       {
            $match: { _id: id }
       },
])

db.collection.aggregate([
  {
    "$group": { //Group by series
      "_id": "$series",
      "sameSeries": { //Create an object
        $push: { //push the required fields
          "title": "$title",
          "_id": "$_id"
        }
      }
    }
  }
])

playground

db.collection.aggregate([
  {
    "$match": {
      "_id": 13123123123,
      "sameSeries": {
        "$exists": false
      }
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "series",
      "foreignField": "series",
      "as": "sameSeries"
    }
  }
])

Playground

要跳过parent id,可以做一个slice

db.collection.aggregate([
  {
    "$match": {
      "_id": 13123123123,
      
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "series",
      "foreignField": "series",
      "as": "sameSeries"
    }
  },
  {
    "$project": {
      _id: 1,
      series: 1,
      title: 1,
      sameSeries: {
        "$slice": [
          "$sameSeries",
          -1
        ]
      }
    }
  }
])

Play