【问题标题】:How can I combine two collections in MongoDB depending on different IDs?如何根据不同的 ID 在 MongoDB 中组合两个集合?
【发布时间】:2021-08-08 11:17:35
【问题描述】:

我想加入两个 MongoDB 集合。如果 _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 中。

用户收藏:

"_id": "609bc1b9bbc4ff184194c20f",
  "homeCountry": "",
  "birthdate": "",
  "email": "",
  "password": "",
  "firstName": "",
  "lastName": "",
  "__v": 0,
  "about": "",
  "gender": "",

Traveladds 集合:

"{
  "_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"}

【问题讨论】:

  • 你能不能把我们俩收藏起来
  • 您好,我添加了一些图片,这是您要的吗? :)
  • 最好不要发布任何图片,您可以编辑问题并将您的收藏更新为 sn-ps 它!
  • 希望这会更好!

标签: mongodb collections lookup


【解决方案1】:

您已经编写了正确的查询。但是有一些不必要的括号

 db.User.aggregate([
      {
        $lookup: {
          from: "traveladds",
          let: {
            personalId: "$_id"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $eq: [
                    "$creatorId",
                    "$$personalId"
                  ]
                }
              }
            }
          ],
          as: "stockdata"
        }
      },
      
    ])

工作Mongo playground

【讨论】:

  • 嗯,如果我尝试这个,我所有的 stockdata 都会变成空 [],对于所有用户。
  • 您将与traveladds.creatorId 一起加入user._id。所以它只会给你加入文件......你还需要什么
  • 感谢您的帮助!另一个问题是 $_id 必须转换为:personalId: {$toString: "$_id"}!!非常感谢您的宝贵时间
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多