【问题标题】:Mongodb Join then FindMongodb 加入然后查找
【发布时间】:2020-01-11 12:11:36
【问题描述】:

我想加入一个集合然后在 mongodb 中查找。

这是我的收藏:

颜色:

{id: 1, color: 'red'}
{id: 2, color: 'blue'}

价格:

{price_id: 1, price: 4}
{price_id: 2, price: 5}

如何找到价格为 5 美元的颜色?

这是我的解决方案(不起作用):

db.collection('colors').aggregate([
    {
        $lookup:
            {
                from: 'prices',
                localField: 'id',
                foreignField: 'price_id',
                as: 'info'
            },
        $match:
            {
                price: 5
            }
    }
]).toArray((res, err) => {
    if (res) {
        console.log(res);
    } else {
        console.log(err);
    }
})

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    如果你有 MongoDB 3.6 或更高版本

    db.colors.aggregate([
      { $lookup:{
         from: "prices",
         let: { id: "$id"},
         pipeline: [
            { $match: { 
                $expr: {
                  $and:[ { $eq: ["$price_id", "$$id"]}, { $eq: ["$price", 5] }]
                }
            }},
          ],
          as: "info"
      }}
    ])
    

    【讨论】:

      【解决方案2】:

      这是由于您的$match 没有工作造成的!

      价格在info字段中,是数组的内部字段。

      join后的数据是这样的

      { "_id" : ObjectId("5d79125fcc36fb6c276f2edd"), "id" : 1, "color" : "red", "info" : [ { "_id" : ObjectId("5d79128ccc36fb6c276f2edf"), "price_id" : 1, "price" : 4 } ] }
      { "_id" : ObjectId("5d79125fcc36fb6c276f2ede"), "id" : 2, "color" : "blue", "info" : [ { "_id" : ObjectId("5d79128ccc36fb6c276f2ee0"), "price_id" : 2, "price" : 5 } ] }
      

      您可以更改您的$match 功能

       db.getCollection("colors").aggregate(
      [
      {$lookup: {  from: 'prices', 
                    localField: 'id',
                    foreignField: 'price_id',
                    as: 'info'}
                },
      {$unwind :"$info"},
      {$match:{"info.price":5}}
      ]
      )
      
      

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2011-11-28
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多