从 $lookup in mongo 返回的列表中提取一个值
Extract a value from the list returned by $lookup in mongo
我在 mongo 数据库中有 2 个集合。
# Collaction 1 named C1
{
_id: 1,
a: 10
},
{
_id: 2,
a: 20
}
# Collaction 2 named C2
{
_id: 1,
b: 500
},
{
_id: 2,
b: 600
}
我尝试使用下面的 $lookup
查询
加入两者
db.C1.aggregate(
[
{
$lookup: {
from: "C2",
localField: "_id",
foreignField: "_id",
as: "b"
}
}
]);
它returns输出集合看起来像这样,
{
_id: 1,
a: 10,
b: [{_id: 1, b: 500}]
},
{
_id: 2,
a: 20,
b: [{_id: 2, b: 600}]
}
join 工作成功,但我只想要集合 2 中 b 的值而不是整个文档作为列表,
#Desired Output
{
_id: 1,
a: 10,
b: 500
},
{
_id: 2,
a: 20,
b: 600
}
我们如何做到这一点?
在 let
字段中使用 _id
设置一个变量,并使用 pipeline
字段在您的 lookup
集合 (c2) 上实现所需的阶段。
希望这段代码对您有所帮助:
db.C1.aggregate(
[
{
"$lookup": {
"from": "C2",
"as": "b",
"let": {
"localId": "$_id"
},
"pipeline": [
{
"$match": {
"$expr": {
"$eq": [
"$_id",
"$$localId"
]
}
}
},
{
"$project": {
"_id": false,
"b": true
}
},
{
"$limit": 1
}
]
}
},
{
"$addFields": {
"b": {
"$arrayElemAt": [
"$b",
0
]
}
}
}
]
);
lookup
管道的第 3 阶段仅用于获取第一个文档 ($limit: 1
)。
和 aggregate
上的第 2 阶段仅用于替换 b
属性.
上的 $b
值
我在 mongo 数据库中有 2 个集合。
# Collaction 1 named C1
{
_id: 1,
a: 10
},
{
_id: 2,
a: 20
}
# Collaction 2 named C2
{
_id: 1,
b: 500
},
{
_id: 2,
b: 600
}
我尝试使用下面的 $lookup
查询
db.C1.aggregate(
[
{
$lookup: {
from: "C2",
localField: "_id",
foreignField: "_id",
as: "b"
}
}
]);
它returns输出集合看起来像这样,
{
_id: 1,
a: 10,
b: [{_id: 1, b: 500}]
},
{
_id: 2,
a: 20,
b: [{_id: 2, b: 600}]
}
join 工作成功,但我只想要集合 2 中 b 的值而不是整个文档作为列表,
#Desired Output
{
_id: 1,
a: 10,
b: 500
},
{
_id: 2,
a: 20,
b: 600
}
我们如何做到这一点?
在 let
字段中使用 _id
设置一个变量,并使用 pipeline
字段在您的 lookup
集合 (c2) 上实现所需的阶段。
希望这段代码对您有所帮助:
db.C1.aggregate(
[
{
"$lookup": {
"from": "C2",
"as": "b",
"let": {
"localId": "$_id"
},
"pipeline": [
{
"$match": {
"$expr": {
"$eq": [
"$_id",
"$$localId"
]
}
}
},
{
"$project": {
"_id": false,
"b": true
}
},
{
"$limit": 1
}
]
}
},
{
"$addFields": {
"b": {
"$arrayElemAt": [
"$b",
0
]
}
}
}
]
);
lookup
管道的第 3 阶段仅用于获取第一个文档 ($limit: 1
)。
和 aggregate
上的第 2 阶段仅用于替换 b
属性.
$b
值