【问题标题】:Fetch data from objectids subarray mongodb aggregation从 objectids 子数组 mongodb 聚合中获取数据
【发布时间】:2023-01-14 14:37:03
【问题描述】:

我有一个集合:

作者

[{
    _id: "63c242130b17d5516e0cb499",
    author_name:'Vyom',
    book_ids:["63c242330b17d5516e0cb49a","63c242410b17d5516e0cb49b"]
}]

[
    {
       _id:"63c242330b17d5516e0cb49a",
       author_id:'63c242130b17d5516e0cb499',
       book_name:'True Love',
       genere:'horror'
    },
    {
       _id:"63c242410b17d5516e0cb49b",
       author_id:'63c242130b17d5516e0cb499',
       book_name:'Monster Strike',
       genere:'romance'
    },
]

如果 book_ids 存在,我想在作者集合聚合中获取书籍的详细信息。

为此,我试过:

db.author.aggregate([
     {
       $match: {
         _id: ObjectId("63c242130b17d5516e0cb499")
       }
     },
     {
       $lookup:{
         from: 'book',
         localField: '_id',
         foreignField: 'author_id',
         as: 'book_details'
       }
     },
     {
        $addFields:{
           book_info: {
             $map: {
              input: '$book_details'
              as: 'el'
              in: {
                  $match: {_id:ObjectId('$$el._id')},
                  $paroject: {book_name: 1},
              }
             }
           }
        }                   
     }
])

但它抛出:无法识别的错误:'$match'。

预期的 O/P:

[{
    _id: "63c242130b17d5516e0cb499",
    author_name:'Vyom',
    book_ids:["63c242330b17d5516e0cb49a","63c242410b17d5516e0cb49b"],
    book_info: [
        {
            _id:"63c242330b17d5516e0cb49a",
            book_name:'True Love',
        },
        {
            _id:"63c242410b17d5516e0cb49b",
            book_name:'Monster Strike',
        }
    ]
}]

有没有其他方法可以循环并获取详细信息。我尝试寻找其他解决方案,但找不到。

【问题讨论】:

    标签: javascript node.js database mongodb mongoose


    【解决方案1】:

    我不明白为什么您需要 $set 阶段来为 book_info 字段格式化 book_details 数组中的元素。

    您可以使用 $lookup with pipeline 连接两个集合并格式化返回的文档数组。

    db.author.aggregate([
      {
        $match: {
          _id: ObjectId("63c242130b17d5516e0cb499")
        }
      },
      {
        $lookup: {
          from: "book",
          localField: "book_ids",
          foreignField: "_id",
          as: "book_info",
          pipeline: [
            {
              $project: {
                _id: 1,
                book_name: 1
              }
            }
          ]
        }
      }
    ])
    

    Demo @ Mongo Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2021-02-08
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多