MongoDB v4的聚合查找查询中的投影
我正在使用MongoDB v4,我有两个集合:MongoDB v4的聚合查找查询中的投影,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在使用MongoDB v4,我有两个集合:user和stadiums 用户: 体育场馆: { "_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"), "name" : "Ipsum" } 当我运行此代码时: db.users.aggregate([ {$match: {name: 'Lorem'}}, { $lookup: { from: "stadiums", l
user
和stadiums
用户:
体育场馆:
{
"_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
"name" : "Ipsum"
}
当我运行此代码时:
db.users.aggregate([
{$match: {name: 'Lorem'}},
{
$lookup:
{
from: "stadiums",
localField: "stadiums.stadium",
foreignField: "_id",
as: "result"
}
}
])
我收到这个:
{
"_id" : ObjectId("5e8a2ff9672f9f4327bbf4d6"),
"name" : "Lorem",
"stadiums" : [
{
"stadium" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
"visited" : 0
}
],
"result" : [
{
"_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
"name" : "Ipsum"
}
]
}
我想将已访问的属性放入结果数组中。是否可行?您可以尝试以下聚合查询:
db.users.aggregate([
{ $match: { name: "Lorem" } },
{ $unwind: "$stadiums" }, // Unwind stadiums array to object
{
$lookup: {
from: "stadiums",
let: { visited: "$stadiums.visited", stadium: "$stadiums.stadium" }, // Create local variables
pipeline: [
{ $match: { $expr: { $eq: ["$_id", "$$stadium"] } } },
{ $addFields: { visited: "$$visited" } }, // Add 'visited' value to matched Stadium doc & return 'stadium'
],
as: "stadiums",
},
},
{
$group: {
_id: "$_id",
name: { $first: "$name" },
stadiums: { $push: { $arrayElemAt: ["$stadiums", 0] } }, /** Pick first object from 'stadiums' array(o/p of lookup) & push to stadiums */
},
},
]);
测试:您可以尝试以下聚合查询:
db.users.aggregate([
{ $match: { name: "Lorem" } },
{ $unwind: "$stadiums" }, // Unwind stadiums array to object
{
$lookup: {
from: "stadiums",
let: { visited: "$stadiums.visited", stadium: "$stadiums.stadium" }, // Create local variables
pipeline: [
{ $match: { $expr: { $eq: ["$_id", "$$stadium"] } } },
{ $addFields: { visited: "$$visited" } }, // Add 'visited' value to matched Stadium doc & return 'stadium'
],
as: "stadiums",
},
},
{
$group: {
_id: "$_id",
name: { $first: "$name" },
stadiums: { $push: { $arrayElemAt: ["$stadiums", 0] } }, /** Pick first object from 'stadiums' array(o/p of lookup) & push to stadiums */
},
},
]);
测试:以下聚合给出了预期结果-即,将相应的
已访问的字段插入结果
数组元素
db.users.aggregate( [
{
$match: { name: "Lorem" }
},
{
$lookup: {
from: "stadiums",
localField: "stadiums.stadium",
foreignField: "_id",
as: "result"
}
},
{
$addFields: {
result: {
$map: {
input: "$result", as: "r",
in: {
$mergeObjects: [
"$$r",
{ visited: {
$reduce: {
input: "$stadiums", initialValue: 0,
in: {
$cond: [ { $eq: [ "$$this.stadium", "$$r._id" ] },
{ $sum : ["$$value", "$$this.visited" ] }, 0
]
}
}
} }
]
}
}
}
}
}
]).pretty()
下面的聚合给出了预期结果-即,将相应的已访问
字段插入到结果
数组元素中
db.users.aggregate( [
{
$match: { name: "Lorem" }
},
{
$lookup: {
from: "stadiums",
localField: "stadiums.stadium",
foreignField: "_id",
as: "result"
}
},
{
$addFields: {
result: {
$map: {
input: "$result", as: "r",
in: {
$mergeObjects: [
"$$r",
{ visited: {
$reduce: {
input: "$stadiums", initialValue: 0,
in: {
$cond: [ { $eq: [ "$$this.stadium", "$$r._id" ] },
{ $sum : ["$$value", "$$this.visited" ] }, 0
]
}
}
} }
]
}
}
}
}
}
]).pretty()
是的,你可以。您想知道用户访问每个体育场的次数。看看聚合运算符的用法。是的,您可以。您想知道用户访问每个体育场的次数。看看聚合操作符的用法。哦,太好了,这正是我想要的。谢谢!哦,太好了,这正是我想要的。谢谢!谢谢你@prasad_!谢谢你@prasad_!