mongoose MongoDB嵌套聚合

pu82cl6c  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(187)

因此,我有两个集合UserBook,我希望聚合它们以接收特定用户ID的输出(显示在帖子末尾)。
以下是这些产品系列:

使用者

每个文档包含用户的User IDName以及包含Book集合中文档ID的数组和布尔属性read

[
  {
    _id: ObjectId('adfa2sd5'),
    name: "Mia",
    books: [
        {
            bid: "154854",
            read: true
        },
        {
            bid: "5475786",
            read: false
        }
    ]

  },

  {
    _id: ObjectId('uai5as5a'),
    name: "Jack",
    books: [
        {
            bid: "5475786",
            read: true
        }
    ]

  }
]

预订

每个文档都拥有一本book IDname的书。

[
  {
    _id: ObjectId('154854'),
    name: "The Great Gatsby"
  },

  {
    _id: ObjectId('5475786'),
    name: "Frankenstein"
  },
]

输出量:
输出包含User ID沿着数组book_list,数组book_list包含来自 Book 集合的文档的每本书的详细信息(ID、名称),该集合基于来自用户文档的books.bidbooks.bidread字段。

[
  {
    _id: ObjectId('adfa2sd5'),
    book_list: [
        {
            _id: ObjectId('154854'),
            name: "The Great Gatsby",
            read: true
        },
        {
            _id: ObjectId('5475786'),
            name: "Frankenstein",
            read: false
        }
    ]

  }
]
watbbzwu

watbbzwu1#

这里有一个方法可以做到这一点。

db.users.aggregate([
  {
    "$match": {
      "_id": ObjectId("fedcba9876543210fedcba98")
    }
  },
  {
    "$lookup": {
      "from": "books",
      "localField": "books.bid",
      "foreignField": "_id",
      "as": "bookList"
    }
  },
  {
    "$set": {
      "books": {
        "$map": {
          "input": "$books",
          "as": "book",
          "in": {
            "$mergeObjects": [
              "$$book",
              {
                "name": {
                  "$getField": {
                    "field": "name",
                    "input": {
                      "$first": {
                        "$filter": {
                          "input": "$bookList",
                          "cond": {"$eq": ["$$this._id", "$$book.bid"]}
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  {"$unset": ["bookList", "name"]}
])

mongoplayground.net上试试。

相关问题