Mongo 数据库加入 Primary/Foreign 键
Mongo DB Join on Primary/Foreign Key
我有两个合集,即:clib
和 mp
。
clib
的架构是:{name: String, type: Number}
而 mp
的架构是:{clibId: String}
.
clib
的示例文档:
{_id: ObjectId("6178008397be0747443a2a92"), name: "c1", type: 1}
{_id: ObjectId("6178008397be0747443a2a91"), name: "c2", type: 0}
mp
的示例文档:
{clibId: "6178008397be0747443a2a92"}
{clibId:"6178008397be0747443a2a91"}
在查询 mp
时,我想要在 clib
集合中具有 type = 0
的那些 clibId's
。
知道如何实现吗?
我能想到的一种方法是使用 $lookUp
,但这似乎不起作用。另外,我不确定这是否是 mongodb 的反模式,另一种方法是将 type
从 clib
复制到 mp
,同时保存 mp document
。
如果我没理解错的话,您可以使用这样的管道:
此查询从 clib
获取值,其中 _id
与 clibId
相同,并且还有 type = 0
。此外,我还添加了一个 $match
阶段,以便在没有任何巧合的情况下不输出值。
db.mp.aggregate([
{
"$lookup": {
"from": "clib",
"let": {
"id": "$clibId"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [
{
"$eq": [
{
"$toObjectId": "$$id"
},
"$_id"
]
},
{
"$eq": [
"$type",
0
]
}
]
}
}
}
],
"as": "result"
}
},
{
"$match": {
"result": {
"$ne": []
}
}
}
])
示例here
db.mp.aggregate([
{
$lookup: {
from: "clib",
let: {
clibId: "$clibId"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [ "$_id", "$$clibId" ],
}
]
}
}
},
{
$project: { type: 1, _id: 0 }
}
],
as: "clib"
}
},
{
"$unwind": "$clib"
},
{
"$match": {
"clib.type": 0
}
}
])
我有两个合集,即:clib
和 mp
。
clib
的架构是:{name: String, type: Number}
而 mp
的架构是:{clibId: String}
.
clib
的示例文档:
{_id: ObjectId("6178008397be0747443a2a92"), name: "c1", type: 1}
{_id: ObjectId("6178008397be0747443a2a91"), name: "c2", type: 0}
mp
的示例文档:
{clibId: "6178008397be0747443a2a92"}
{clibId:"6178008397be0747443a2a91"}
在查询 mp
时,我想要在 clib
集合中具有 type = 0
的那些 clibId's
。
知道如何实现吗?
我能想到的一种方法是使用 $lookUp
,但这似乎不起作用。另外,我不确定这是否是 mongodb 的反模式,另一种方法是将 type
从 clib
复制到 mp
,同时保存 mp document
。
如果我没理解错的话,您可以使用这样的管道:
此查询从 clib
获取值,其中 _id
与 clibId
相同,并且还有 type = 0
。此外,我还添加了一个 $match
阶段,以便在没有任何巧合的情况下不输出值。
db.mp.aggregate([
{
"$lookup": {
"from": "clib",
"let": {
"id": "$clibId"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [
{
"$eq": [
{
"$toObjectId": "$$id"
},
"$_id"
]
},
{
"$eq": [
"$type",
0
]
}
]
}
}
}
],
"as": "result"
}
},
{
"$match": {
"result": {
"$ne": []
}
}
}
])
示例here
db.mp.aggregate([
{
$lookup: {
from: "clib",
let: {
clibId: "$clibId"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [ "$_id", "$$clibId" ],
}
]
}
}
},
{
$project: { type: 1, _id: 0 }
}
],
as: "clib"
}
},
{
"$unwind": "$clib"
},
{
"$match": {
"clib.type": 0
}
}
])