查询以使用 mongoDB 中的聚合获得特定的 sub-doc?

Query to get specific sub-doc using aggregation in mongoDB?

我想知道一个查询,在该查询中我可以使用它的 ObjectId 获得特定的 sub-doc - 或者甚至是 "store" 名称,如果它更容易的话 - 使用聚合方法。我很确定我可以使用 $project,但我不确定如何将它应用到 ObjectId。

我可以使用 find 方法,但我需要它在聚合方法中,所以 mongo 会 return 给我项目的名称,而不是它的 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()

我的店里有五家店 collection。此查询 return 所有五个文档都像下面的代码一样,仅五次。但我想使用它的 ObjectId 指定要 returned 的商店。


{
        "_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")
                }
        ]

}

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

正如你所说的只有一个存储数据是return,所以你可以使用$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()

现在,如果您想 return 特定商店数据 return 使用 $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()

希望这对您有所帮助。