【问题标题】:Query to get specific sub-doc using aggregation in mongoDB?使用 mongoDB 中的聚合查询以获取特定的子文档?
【发布时间】:2019-09-17 01:11:27
【问题描述】:

我想知道一个查询,在该查询中我可以使用它的 ObjectId 获取特定的子文档,或者如果更容易的话,甚至可以使用它的“存储”名称——使用聚合方法。我很确定我可以使用 $project,但我不确定如何将它应用到 ObjectId。

我可以使用 find 方法,但我需要它在一个聚合方法中,所以 mongo 将返回给我项目的名称,而不是它的 ObjectId。

db.stores.aggregate([
  {$unwind: '$inventory'},
  {$lookup: {
    from: 'items',
    localField: 'inventory.item',
    foreignField: '_id',
    as: 'itemsData'
   }},
  {$unwind: '$itemsData'},
  {$group:{
    _id: "$_id",
    inventory: { $push: "$inventory" },
    itemsData: { $push: "$itemsData" }
  }}
]).pretty()

我的商店收藏中有五家商店。此查询返回所有五个文档,如下面的代码,仅返回五次。但我想指定要使用它的 ObjectId 返回的商店。


{
        "_id" : ObjectId("5cc0d6ad1ea502abb28b52cc"),
        "inventory" : [
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a4"),
                        "amount" : 9
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a1"),
                        "amount" : 5
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a7"),
                        "amount" : 2
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b529e"),
                        "amount" : 5
                }
        ],
        "itemsData" : [
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a4"),
                        "item" : "beans",
                        "price" : NumberDecimal("53,75")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a1"),
                        "item" : "bananas",
                        "price" : NumberDecimal("5.00")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a7"),
                        "item" : "watermelon",
                        "price" : NumberDecimal("3.50")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b529e"),
                        "item" : "broccoli",
                        "price" : NumberDecimal("5.50")
                }
        ]

}

我希望查询返回代码,就像上面的代码一样,只有一个商店而不是五个。如果它适合这项任务,我不确定如何使用 $project。

【问题讨论】:

    标签: mongodb aggregation document-database


    【解决方案1】:

    正如你所说,只有一个商店数据要返回,所以你可以使用 $limit :

    db.stores.aggregate([
       {$unwind: '$inventory'},
       {$lookup: {
          from: 'items',
          localField: 'inventory.item',
          foreignField: '_id',
          as: 'itemsData'
       }},
       {$unwind: '$itemsData'},
       {$group:{
          _id: "$_id",
          inventory: { $push: "$inventory" },
          itemsData: { $push: "$itemsData" }
       }},
       { $limit : 1}
      ]).pretty()
    

    现在,如果您想返回要返回的特定商店数据,请使用 $match 查询:

    db.stores.aggregate([
       { $match : { "_id" : ObjectId("5cc0d6ad1ea502abb28b52cc") }},
       {$unwind: '$inventory'},
       {$lookup: {
          from: 'items',
          localField: 'inventory.item',
          foreignField: '_id',
          as: 'itemsData'
       }},
       {$unwind: '$itemsData'},
       {$group:{
          _id: "$_id",
          inventory: { $push: "$inventory" },
          itemsData: { $push: "$itemsData" }
       }}
      ]).pretty()
    

    希望,这很有帮助。

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2020-08-02
      • 1970-01-01
      • 2013-09-10
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      相关资源
      最近更新 更多