【问题标题】:Can I use $in within mongodb's $match aggregate function我可以在 mongodb 的 $match 聚合函数中使用 $in
【发布时间】:2019-02-11 06:24:37
【问题描述】:

我正在尝试在 $match(聚合)函数中使用 $in 运算符。出于某种原因,它不适用于“_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”字段。

【问题讨论】:

  • Mongoose 不会为您使用aggregate 进行任何ids 的转换,但它会为find 进行转换。因此,请确保 ids 包含实际的 ObjectId 对象,而不仅仅是字符串。
  • 我会建议,让猫鼬调试为真,这样你就可以轻松调试了。
  • 感谢 JohnnyHK。一旦我有正确的对象 ID,每个都按预期工作。我希望 mongodb 文档会提到这一点。很清楚。

标签: mongodb mongoose aggregation


【解决方案1】:

$in 运算符与$match 配合得很好。

然而,你的总分在比赛结束后似乎不正确:

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

如果不是简单地在没有组的情况下运行查询,看看这是否有效,这样您就可以看到它有效,然后在您的 $group 部分上工作。

【讨论】:

  • 感谢您的回答。我更正了语法,但这并不能解决问题。
【解决方案2】:

尝试使用

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

然后像这样转换你的数组:

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

然后进行聚合。 对于使用 ORM 的聚合,您必须显式地转换它。

【讨论】:

  • Ankit - 非常感谢您的回答。这就是问题所在。我希望 mongodb 文档可以更轻松地找到这些限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2015-05-25
  • 2015-12-28
  • 2013-03-10
相关资源
最近更新 更多