Mongodb 如何调用子数组中另一个集合中的属性?
我有两个收藏:一个叫做Mongodb 如何调用子数组中另一个集合中的属性?,mongodb,Mongodb,我有两个收藏:一个叫做places和type\u places。一个place关联了一种类型的place(type\u places),这可以关联这个(objects数组)中的一些对象 然后我想当我查询一个地方时,查询会向我显示被咨询的地方,它是什么样的地方(type\u place),以及它有什么对象 所需输出: { "_id": "5fbc7cc705253c2da482023f", "place": "Room
places
和type\u places
。一个place
关联了一种类型的place(type\u places
),这可以关联这个(objects
数组)中的一些对象
然后我想当我查询一个地方
时,查询会向我显示被咨询的地方
,它是什么样的地方(type\u place
),以及它有什么对象
所需输出:
{
"_id": "5fbc7cc705253c2da482023f",
"place": "Room 5",
"type_place_objects": [
{
"_id": "5fbc7cc705253c2da48202saw",
"name": "chair",
"quantify": 4
},
{
"_id": "5fbc7cc705253c2da482025f",
"name": "desktop",
"quantify": 2
}
]
}
我正在尝试,但不起作用:
place.aggregate(
[
{
"$match": {"place":"Room 5"}
},
{
"$lookup": {
"from": "type_place",
"localField": "type_place_id",
"foreignField": "_id",
"as": "type_place_objects"
}
},
{
"$sort": {
"_id": -1
}
},
{
"$project": {
"_id":1,
"place":1,
"type_place_objects": 1
}
}
])
如何修复它?有很多方法,其中一种方法是使用
$lookup
,就像您已经尝试过的那样
db.place.aggregate([
{ "$match": { "place": "Room 5" } },
{ $unwind: "$type_place_objects" },
{
"$lookup": {
"from": "type_place",
"let": { tpo: "$type_place_objects._id" },
"pipeline": [
{ $unwind: "$objects" },
{
$match: {
$expr: {
$eq: [ "$objects._id", "$$tpo" ]
}
}
}
],
"as": "join"
}
},
{
$addFields: {
"join": { "$arrayElemAt": [ "$join", 0]
}
}
},
{
$addFields: { "type_place_objects.name": "$join.objects.name" }
},
{
$group: {
_id: "$_id",
place: { $first: "$place" },
type_place_objects: { "$addToSet": "$type_place_objects" }
}
}
])
工作你能给我解释一下这句话吗:
加入:{“$arrayElemAt”:[“$join”,0]
当我们加入(查找)时,它会给你一个数组。使用$arrayElemAt,我得到第一个对象。Thanks genious,如果你有空闲时间,如果你能帮助我,我将不胜感激。我是基于你以前的回答@yavg抱歉,回复太晚了。有点忙。已经回复了
db.place.aggregate([
{ "$match": { "place": "Room 5" } },
{ $unwind: "$type_place_objects" },
{
"$lookup": {
"from": "type_place",
"let": { tpo: "$type_place_objects._id" },
"pipeline": [
{ $unwind: "$objects" },
{
$match: {
$expr: {
$eq: [ "$objects._id", "$$tpo" ]
}
}
}
],
"as": "join"
}
},
{
$addFields: {
"join": { "$arrayElemAt": [ "$join", 0]
}
}
},
{
$addFields: { "type_place_objects.name": "$join.objects.name" }
},
{
$group: {
_id: "$_id",
place: { $first: "$place" },
type_place_objects: { "$addToSet": "$type_place_objects" }
}
}
])