问题描述
我想将一个表与另一个表连接。从联接表中,我也想联接另一个表。可能吗。我将以它为例。这样您就会有一个更好的主意。作为mongoDB的新手,我不知道如何解释。
game
_id: ObjectId("5e6099a40c0ad78d5fedd69e")
line: 7
title: "Test Title"
attendance: "19812"
eventDate: "2020-02-22T00:30:00Z"
__v: 115
createdAt: 2020-03-22T22:39:47.559+00:00
updatedAt: 2020-09-08T02:09:26.430+00:00
count: 65
betCount: 34
bets
_id: ObjectId("5e72df1694d71f34dd561f6e")
isMatched: false
hasWon: true
user: ObjectId("5e6c5b08e1fc8ccde43b12fb")
game: ObjectId("5e6099a40c0ad78d5fedd69e")
amount: 30
createdAt: 2020-03-19T02:55:18.141+00:00
updatedAt: 2020-03-23T03:04:17.062+00:00
__v: 0
users
_id: ObjectId("5e6c5b08e1fc8ccde43b12fb")
name: "Jithin"
bio: "My Name is Jithin."
email: "jithin@gmail.com"
createdAt: 2020-03-12T21:55:49.024+00:00
updatedAt: 2020-09-09T04:59:13.769+00:00
__v: 0
currentAmount: 232
winnings: 4
我已使用以下代码获取结果,
Games.aggregate([
{
$lookup: {
from: "bets",localField: "_id",foreignField: "game",as: "bets"
}
}
],(err,resp) => {
if (err) {
res.status(500).send(err);
}
res.status(200).json(resp);
});
但是上面代码的输出是
{
"_id": "5e609a4c0c0ad78d5fedd6a0","line": 7,"title": "Test Title","attendance": "19812","eventDate": "2020-02-22T00:30:00Z","__v": 115,"createdAt": "2020-03-22T22:39:47.559+00:00","count": 65,"betCount": 34,"updatedAt": "2020-09-08T02:09:26.430+00:00","bets": [
{
"_id": "5e72df1694d71f34dd561f6e","isMatched": false,"hasWon": true,"user": "5e6c5b08e1fc8ccde43b12fb","game": "5e6099a40c0ad78d5fedd69e","amount": 30,"createdAt": "2020-03-19T02:55:18.141+00:00","updatedAt": "2020-03-23T03:04:17.062+00:00","__v": 0
},....
]
},....
我想将users
与bets
表联接。怎么做。有没有办法做到这一点。最终输出应如下所示,
{
"_id": "5e609a4c0c0ad78d5fedd6a0","user": [
{
"_id": "5e6c5b08e1fc8ccde43b12fb","name": "Jithin","bio": "My Name is Jithin.","email": "jithin@gmail.com","createdAt": "2020-03-12T21:55:49.024+00:00","updatedAt": "2020-09-09T04:59:13.769+00:00","__v": 0,"currentAmount": 232,"winnings": 4
},....
]
"game": "5e6099a40c0ad78d5fedd69e",....
无论如何,都可以达到上述效果。我不知道如何实现这一目标。我是node.js和mongodb的新手。我真的被困在这里。
解决方法
您可以使用嵌套查询,
-
$lookup
使用带有bets
集合的管道 -
$match
下注ID -
$lookup
和user
集合
Games.aggregate([
{
$lookup: {
from: "bets",let: { id: "$_id" },pipeline: [
{ $match: { $expr: { $eq: ["$$id","$game"] } } },{
$lookup: {
from: "user",localField: "user",foreignField: "_id",as: "user"
}
}
],as: "bets"
}
}
],(err,resp) => {
if (err) res.status(500).send(err);
res.status(200).json(resp);
});