【问题标题】:Concept of hasmany inside $lookup mongo$lookup mongodb里面hasmany的概念
【发布时间】:2021-12-18 01:46:27
【问题描述】:

我是 mongoDB 的新手。也许这是一个简单的问题。请帮我解决这个问题。

有 2 个表 book 和 bookStocks。

桌书

{ 
    "_id" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", 
    "nameOfBook" : "test", 
    "nameOfAuthor" : "test authou", 
    "yearOfPublication" : "1998", 
    "publication" : "test", 
    "edition" : "test", 
    "status" : "available", 
    "price" : "test", 
    "addedOn" : ISODate("2021-10-27T08:39:00.147+0000")
}

桌书架

{ 
    "_id" : "SHNC-E1C6CF22A055-4A7E-AB79-CAEDC65AB29C", 
    "bookId" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", 
    "collegeId" : "COL-D0E03FA4803F-4224-A321-1801626A9942", 
    "course" : "bcom", 
    "bookDetails" : "eeff", 
    "status" : "available", 
    "addedOn" : ISODate("2021-11-01T08:26:54.916+0000")
}

我将拥有的唯一值是collegeId。这就是我需要的结果

[
  {
    "_id": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
    "nameOfBook": "test",
    "nameOfAuthor": "test authou",
    "yearOfPublication": "1998",
    "publication": "test",
    "status": "available",
    "price": "test",
    "addedOn": "2021-10-27T08:39:00.147Z",
    "bookStocks": [
      {
        "_id": "SHNC-E1C6CF22A055-4A7E-AB79-CAEDC65AB29C",
        "bookId": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
        "collegeId": "COL-D0E03FA4803F-4224-A321-1801626A9942",
        "course": "bcom",
        "bookDetails": "eeff",
        "status": "available",
        "addedOn": ISODate("2021-11-01T08:26:54.916+0000")
      },
      {
        "_id": "SHNC-E1C6CF22A055-4A7E-AB79-CAEDC65AB29D",
        "bookId": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
        "collegeId": "COL-D0E03FA4803F-4224-A321-1801626A9942",
        "course": "bcom",
        "bookDetails": "eeff",
        "status": "available",
        "addedOn": ISODate("2021-11-01T08:26:54.916+0000")
      }
    ]
  }
]

这是我正在尝试的代码

  const pipeline = [
    { $match: { 'bookStocks.collegeId': collegeId } },
    {
      "$lookup": {
        "from": "bookStocks",
        let: {
          bookId: "$bookId"
        },
        pipeline: [
          {
            $match: {
              $expr: {
                $eq: [
                  "$$bookId",
                  "$bookId"
                ]
              }
            }
          }
        ],
        "as": "bookStocks"
      }
    }
  ];

我确定这是不正确的。谁能帮我这个?提前致谢。

【问题讨论】:

    标签: arrays mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您的查询中有 2 处更正,

    • collegeId匹配条件移动到查找的管道匹配阶段
    • 放置一个$match 阶段,通过检查$ne 条件来过滤空/不匹配的书籍
    const pipeline = [
      {
        $lookup: {
          from: "bookStocks",
          let: { bookId: "$_id" },
          pipeline: [
            {
              $match: {
                $and: [
                  { $expr: { $eq: ["$$bookId", "$bookId"] } },
                  { collegeId: collegeId }
                ]
              }
            }
          ],
          as: "bookStocks"
        }
      },
      { $match: { bookStocks: { $ne: [] } } }
    ];
    

    Playground

    【讨论】:

      【解决方案2】:

      你可以使用查找和匹配

      db.books.aggregate([
        {
          "$lookup": {
            "from": "bookStocks",
            "localField": "_id",
            "foreignField": "bookId",
            "as": "bookStocks"
          }
        },
        {
          $match: {
            "bookStocks.collegeId": "COL-D0E03FA4803F-4224-A321-1801626A9942"
          }
        },
        
      ])
      

      https://mongoplayground.net/p/_jOZ1ZM-xgd

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 1970-01-01
        • 2012-05-20
        • 2015-12-27
        相关资源
        最近更新 更多