#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"
}
},
])