поиск агрегации mongodb с несколькими условиями и идентификаторами - PullRequest
0 голосов
/ 22 февраля 2019

Наличие следующих коллекций и данных о них

db.a.insert([
  { "_id" : ObjectId("5b56989172ebcb00105e8f41"), "items" : [{id:ObjectId("5b56989172ebcb00105e8f41"), "instock" : 120}]},
  { "_id" : ObjectId("5b56989172ebcb00105e8f42"), "items" : [{id:ObjectId("5b56989172ebcb00105e8f42"), "instock" : 120}] },
  { "_id" : ObjectId("5b56989172ebcb00105e8f43"), "items" : [{ObjectId("5b56989172ebcb00105e8f43"), "instock" : 80}] }
])

db.b.insert([
  { "_id" : ObjectId("5b56989172ebcb00105e8f41")},
  { "_id" : ObjectId("5b56989172ebcb00105e8f42")},
  { "_id" : ObjectId("5b56989172ebcb00105e8f43")},
  { "_id" : ObjectId("5b56989172ebcb00105e8f44")},
  { "_id" : ObjectId("5b56989172ebcb00105e8f45")}
])

при выполнении агрегации поиска, например

db.b.aggregate([
   {
      $lookup:
         {
           from: "b",
           let: { bId: "$_id", qty: 100 },
           pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$items.id",  "$$bId" ] },
                         { $gte: [ "$instock", "$$qty" ] }
                       ]
                    }
                 }
              }
           ],
           as: "a"
         }
    }
])

, не приводит к каким-либо результатам в ожидаемой операции поиска.Есть ли какие-либо ограничения на использование ObjectId для сравнения?В официальной документации ничего не говорится об этом, и он работает как брелок с любым другим типом данных, например со строками

1 Ответ

0 голосов
/ 22 февраля 2019

Я не уверен, является ли это ошибкой в ​​mongodb или нет, но запрос работает только после добавления этапа $unwind.

db.b.aggregate([
   {
      $lookup:
         {
           from: "a",
           let: { bId: "$_id", qty: 100 },
           pipeline: [
           {    
             $unwind: {
               path: "$items"
             }
           },
           { $match:
              { $expr:
                        { $and:
                            [
                                { $eq: [ "$items.id",  "$$bId" ] },
                                { $gte: [ "$items.instock",  "$$qty" ] },
                            ]
                        }
                    }
                }
           ],
           as: "a"
         }
    }
]);

Примечание: Условия соединения и некоррелированные под-запросы были добавлены в монго 3,6

...