#mongoose #aggregate #lookup
Вопрос:
У меня есть схема мангуста, как показано ниже
var customers = new Schema({
code: { type: String, required: true },
companyName: { type: String, required: true }
});
var quotations = new Schema({
quotationNo: { type: Number, required: true },
customer: [
{ type: Schema.Types.ObjectId, ref: 'Customers' }
],
quotationStatus: [
{ type: Schema.Types.ObjectId, ref: 'QuotationStatuses' }
],
})
var quotationStatuses = new Schema({
quotationStatusName: { type: String, required: true }
});
И мои коллекции, как показано ниже
Customers
{
"_id" : ObjectId("60517d3d8071452874926381"),
"code" : "M100003",
"companyName" : "Mongo Ltd"
}
Quotations
[
{
"_id" : ObjectId("605daf8609314910019239b1"),
"quotationNo" : "Q100000",
"customer" : "customer": [
{
"$oid": "60517d3d8071452874926381"
}
],
"quotationStatus": [
{
"$oid": "5fd03678926f57315414ebcb"
}
],
},
{
"_id" : ObjectId("605daf860931491001923921"),
"quotationNo" : "Q100001",
"customer" : "customer": [
{
"$oid": "60517d3d8071452874926381"
}
],
"quotationStatus": [
{
"$oid": "5fd03766926f57315414ebcc"
}
],
},
,
{
"_id" : ObjectId("605daf860931491001923956"),
"quotationNo" : "Q100002",
"customer" : "customer": [
{
"$oid": "60517d3d8071452874926381"
}
],
"quotationStatus": [
{
"$oid": "5fd03678926f57315414ebcb"
}
]
}
]
QuotationStatuses
[{
"_id": {
"$oid": "5fd03678926f57315414ebcb"
},
"quotationStatusName": "FIRST SUBMISSION",
"__v": 0
},{
"_id": {
"$oid": "5fd03766926f57315414ebcc"
},
"quotationStatusName": "REVISE SUBMISSION",
"__v": 0
}]
Я хочу получить все предложения, в которых статус предложения — «ПЕРВАЯ ОТПРАВКА». Поэтому я попробовал выполнить свой запрос, как показано ниже
Customers.aggregate([
{
$lookup: {
from: "quotations",
let: {
"customerID": "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: ["quotationStatus":"5fd03678926f57315414ebcb"]
}
]
}
}
}
],
as: "quotations"
}
}
])
Но не повезло, я не могу получить ответ.
Когда дело доходит до сопоставления quotationStatus с идентификатором объекта, результат не возвращается.
Может ли каждый посоветовать, где я ошибаюсь.
Спасибо
Ответ №1:
Я думаю, что вы должны передать идентификатор как ObjectId(‘5fd03678926f57315414ebcb’) в конвейер. Потому что агрегатные функции принимают его как строку.
$and: [
{
$eq: [ "quotationStatus": mongoose.Types.ObjectId("5fd03678926f57315414ebcb") ]
}
]