我想创建一个聚合管道,其中一个匹配项使用其他集合(内部查询)的结果。这是一个例子:
db.users.aggregate([
{"$match":{"id":{"$in":["0","1","2"]},"p": {$in: db.groups.distinct("p", {"enable":true)}}},
{"$group":{"_id":"$v","number":{"$sum":1}}}
])
我需要从javascript进行查询。实际上,该应用程序是 nodejs 和 mongoose。
不幸的是,当 Mongoose 执行查询时,我得到:
MongoError: $in needs an array
这是 Mongoose 打印的查询:
Mongoose: users.aggregate([
{"$match":{"id":{"$in":["0","1","2"]},"p": {$in: 'db.groups.distinct("p", {"enable":true)'}},
{"$group":{"_id":"$v","number":{"$sum":1}}}
])
任何人都可以帮我如何通过 javascript 传递内部查询吗?
更新: 这些集合是分片的,所以我不能使用$lookup,这就是我想使用具有不同的$in的原因
最佳答案
TLDR;
Mongoose 的等效方法是首先运行嵌套查询,然后将结果传递给聚合。
groups.distinct("p", {"enable": true}).exec().then(matchingGroups => {
return users.aggregate([
{$match: {"id": {$in: ["0", "1", "2"]}, p: {$in: matchingGroups}}},
{$group:{_id:"$v", number:{$sum:1 }}}
]).exec();
}).then(aggregationResult => {
console.log(aggregationResult);
});
说明
在 mongo shell 中执行以下脚本时,会先提交内部查询(distinct),然后将结果传递给外部查询(聚合),然后提交执行。这可以通过捕获数据包跟踪来确认。在附图中,我们可以看到 first query submission (数据包 9)收到的响应(数据包 10 和 11),以及 aggregation query submission (数据包 12 和 13)。
关于javascript - 如何从javascript在mongodb中传递内部查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62521211/