агрегированный поиск мангуста с соответствующим идентификатором объекта

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