如何使用MongoDBmongoose db在汇总中添加$ lookup填充

问题描述

我想将一个表与另一个表连接。从联接表中,我也想联接另一个表。可能吗。我将以它为例。这样您就会有一个更好的主意。作为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
        },....
    ]
},....

我想将usersbets表联接。怎么做。有没有办法做到这一点。最终输出应如下所示,

{
    "_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
  • $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);
});

Playground

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...