如何根据不同的 ID 将两个 collections 合并到 MongoDB 中?
How can I combine two collections in MongoDB depending on different IDs?
我想加入 MongoDB 的两个 collection。如果 _id 和 creatorId 匹配,我想加入他们。这就是我所做的。
User.aggregate([
{
$lookup:
{
from: "traveladds",
let: { personalId: "$_id"},
pipeline: [
{ $match:
{ $expr:
[
{ $eq: [ "$creatorId", "$$personalId" ] },
]
}
}
],
as: "stockdata"
}
},
]).exec((err, result) => {
if(err){
res.send(err)
}
if(result){
res.send({
error: false,
data: result,
})
}
})
但是当我这样做时,traveladds-collection 中的所有文档都存储在所有用户的 stockdata 中。
用户collection:
"_id": "609bc1b9bbc4ff184194c20f",
"homeCountry": "",
"birthdate": "",
"email": "",
"password": "",
"firstName": "",
"lastName": "",
"__v": 0,
"about": "",
"gender": "",
Traveladds collection:
"{
"_id": "609bc1fdbbc4ff184194c210",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609bc1b9bbc4ff184194c20f",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
这是结果:
data": [
{
"_id": "609bc1b9bbc4ff184194c20f",
"homeCountry": "",
"birthdate": "",
"email": "",
"password": "",
"firstName": "",
"lastName": "",
"__v": 0,
"about": "",
"gender": "",
"stockdata": [
{
"_id": "609bc1fdbbc4ff184194c210",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609bc1b9bbc4ff184194c20f",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
{
"_id": "609eb5f401c77217984e4a78",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609e9bb378336c21581cd132",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
{
"_id": "60a216cfd43c8e1e375cf0a8",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609e39572c60480de0fd6ef1",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
]
},
如您所见,即使有 creatorId != _id,它也会显示在 stockdata 中。而这三个都出现在所有用户中。
有人可以给我提供任何想法吗?
提前致谢,祝您有愉快的一天。
更新:
这与下面的答案相结合!
personalId: {$toString: "$_id"}
您写了正确的查询。但是有一些不必要的括号
db.User.aggregate([
{
$lookup: {
from: "traveladds",
let: {
personalId: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$creatorId",
"$$personalId"
]
}
}
}
],
as: "stockdata"
}
},
])
我想加入 MongoDB 的两个 collection。如果 _id 和 creatorId 匹配,我想加入他们。这就是我所做的。
User.aggregate([
{
$lookup:
{
from: "traveladds",
let: { personalId: "$_id"},
pipeline: [
{ $match:
{ $expr:
[
{ $eq: [ "$creatorId", "$$personalId" ] },
]
}
}
],
as: "stockdata"
}
},
]).exec((err, result) => {
if(err){
res.send(err)
}
if(result){
res.send({
error: false,
data: result,
})
}
})
但是当我这样做时,traveladds-collection 中的所有文档都存储在所有用户的 stockdata 中。
用户collection:
"_id": "609bc1b9bbc4ff184194c20f",
"homeCountry": "",
"birthdate": "",
"email": "",
"password": "",
"firstName": "",
"lastName": "",
"__v": 0,
"about": "",
"gender": "",
Traveladds collection:
"{
"_id": "609bc1fdbbc4ff184194c210",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609bc1b9bbc4ff184194c20f",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
这是结果:
data": [
{
"_id": "609bc1b9bbc4ff184194c20f",
"homeCountry": "",
"birthdate": "",
"email": "",
"password": "",
"firstName": "",
"lastName": "",
"__v": 0,
"about": "",
"gender": "",
"stockdata": [
{
"_id": "609bc1fdbbc4ff184194c210",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609bc1b9bbc4ff184194c20f",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
{
"_id": "609eb5f401c77217984e4a78",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609e9bb378336c21581cd132",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
{
"_id": "60a216cfd43c8e1e375cf0a8",
"title": "",
"destination": "",
"description": "",
"minbudget": ,
"maxbudget": ,
"startdate": "",
"enddate": "",
"creatorId": "609e39572c60480de0fd6ef1",
"creatorName": "",
"createdAt": "",
"updatedAt": "",
"__v": 0
},
]
},
如您所见,即使有 creatorId != _id,它也会显示在 stockdata 中。而这三个都出现在所有用户中。
有人可以给我提供任何想法吗? 提前致谢,祝您有愉快的一天。
更新: 这与下面的答案相结合!
personalId: {$toString: "$_id"}
您写了正确的查询。但是有一些不必要的括号
db.User.aggregate([
{
$lookup: {
from: "traveladds",
let: {
personalId: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$creatorId",
"$$personalId"
]
}
}
}
],
as: "stockdata"
}
},
])