Могу ли я использовать $ in в функции агрегата $ match mongodb - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь использовать оператор $ in в функции $ match (aggregate). По какой-то причине он не работает в поле '_Id', но я не могу найти никакой документации, отмечающей, что это не поддерживается в mongodb.

var ids = ['1', '2', '3', '4'];  //an example. I am using real mongo object ids


// this is working fine
Product.find({_id : {$in : ids}})
 .exec(function(err, res){
  res.json(res);
  });

// no results here
Product.aggregate([
 {$match : {_id : {$in : ids}}},
 {$group : {_id : '$pCode', total : {$sum : '$pWeight'}}])
  .exec(function(err, res){
   res.json(res);

Теперь, если я использую другие поля для запроса, он работает нормально, и я получаю желаемый результат, используя $ in. Но по какой-то причине это не работает для поля _id.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

попробуйте использовать

const ObjectId = require("mongodb").ObjectID;

и затем преобразуйте ваш массив следующим образом:

var ids = [ObjectId('5ae6d812e5504726a69fc285'),ObjectId('5b0bcfc254c93a2734d56efb')];

, а затем выполните агрегацию. Для агрегации с использованием ORM вы должны привести ее явно.

0 голосов
/ 06 сентября 2018

$in оператор отлично работает с $match.

Ваш агрегат, похоже, не соответствует действительности после матча:

Product.aggregate([
 {$match : {_id : {$in : ids}}},
 {$group : {_id : '$pCode', total : {$sum : '$pWeight'}}}
]).exec(function(err, res){
   res.json(res);
})

Посмотрите, сработает ли это, если не просто выполнить запрос без группы, чтобы увидеть, как он работает, а затем работать с вашей $group частью.

...