查询以使用 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()
希望这对您有所帮助。
我想知道一个查询,在该查询中我可以使用它的 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()
希望这对您有所帮助。