Концепция hasmany внутри $lookup монго

#arrays #mongodb #mongoose #mongodb-query #aggregation-framework

Вопрос:

Я новичок в MongoDB. Может быть, это простой вопрос. Пожалуйста, помогите мне с этим.

В распоряжении гостей 2 стола с книгами и книжные полки.

Настольные Книги

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

Я уверен, что это неверно. Кто-нибудь может мне в этом помочь? Заранее спасибо.

Ответ №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: [] } } }
];
 

Игровая площадка

Ответ №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