带有ID的嵌套数组的Mongo聚合

时间:2020-05-15 12:49:21

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

.aggregate([
  {
    $lookup: {
      from: 'books',
      let: { books: '$books' },
      pipeline: [{ $match: { $expr: { _id: { $in: ['_id', '$$books'] } } } }],
      as: 'bookInfos'
    }
  },
  { $unwind: '$bookInfos' },
  { $replaceRoot: { newRoot: '$bookInfos' } }
])

对于您的问题我不太确定,但是我认为这可能是您要寻找的。

答案 1 :(得分:0)

因此此查询对我有用:

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

感谢@zishone。您的查询以某种方式返回了数据库中所有可用的书籍,不仅返回了用户模型中的书籍,而且在查找带有local和foreignField的文档时可以按需运行。