簡體   English   中英

如何使用 MongoDB (mongoose db) 在聚合中添加 $lookup 填充

[英]How to add populate with $lookup in aggregate using MongoDB (mongoose db)

我想將一張桌子與另一張桌子相連。 從連接表我也想加入另一個。 是否可以。 我將展示它作為一個例子。 這樣你會得到一個更好的主意。 作為 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
        },
        ....
    ]
},
....

我想用bets表加入users 怎么做。 有沒有辦法做到這一點。 最終輸出應如下所示,

{
    "_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": [
                {
                    "_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",
            "amount": 30,
            "createdAt": "2020-03-19T02:55:18.141+00:00",
            "updatedAt": "2020-03-23T03:04:17.062+00:00",
            "__v": 0
        },
        ....
    ]
},
....

有沒有辦法達到上述結果。 我不知道如何實現這一目標。 我是 node.js 和 mongodb 的新手。 我真的被困在這里了。

您可以使用嵌套查找,

  • $lookup使用管道和bets收集
  • $match投注編號
  • $lookupuser集合
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);
});

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM