【问题标题】:Mongo Aggregation with nested array of Id´s具有嵌套 ID 数组的 Mongo 聚合
【发布时间】:2020-09-01 07:15:00
【问题描述】:

我有一个Model,其结构类似于:

{
  "_id": ObjectId("5c878c5c18a4ff001b981zh5"),
  "books": [
    ObjectId("5d963a7544ec1b122ab2ddc"),
    ObjectId("5d963be01f663d168f8ea4dc"),
    ObjectId("5d963bcb1f663d168f8ea2f4"),
    ObjectId("5d963bdf1f663d16858ea7c9"),
}

现在我想使用聚合框架来获取仅包含已填充书籍的列表,例如:

{ _id: ObjectId("5d963a7544ec1b122ab2ddc"), title: ...., ... },
 ..

【问题讨论】:

  • 标题是否存储在另一个集合中?
  • 是的。书基本上都有自己收藏。上面的用户模型只存储了一些书的 id,所以我可以填充它们。

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


【解决方案1】:
.aggregate([
  {
    $lookup: {
      from: 'books',
      let: { books: '$books' },
      pipeline: [{ $match: { $expr: { _id: { $in: ['_id', '$$books'] } } } }],
      as: 'bookInfos'
    }
  },
  { $unwind: '$bookInfos' },
  { $replaceRoot: { newRoot: '$bookInfos' } }
])

我不太确定您的问题,但我认为这可能是您正在寻找的。​​p>

【讨论】:

  • 感谢您的回答。不知何故,此查询返回数据库中存在的所有书籍,而不仅仅是用户集合中的书籍。我可以通过这个查询实现想要的结果:
【解决方案2】:

所以这个查询对我有用:

{
          $match: {
            _id: user._id,
          },
        },
        {
          $lookup: {
            from: "books",
            localField: "books",
            foreignField: "_id",
            as: "booksInfo",
          },
        },
        { $unwind: "$booksInfo" },
        {
          $replaceRoot: {
            newRoot: "$booksInfo",
          },
        },

谢谢@zishone。不知何故,您的查询返回了数据库中所有可用的书籍,而不仅仅是来自用户模型的书籍,而且在查找具有本地和外来字段的文档时,它可以正常工作。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2020-04-23
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多