javascript - 如何从javascript在mongodb中传递内部查询

标签 javascript node.js mongodb mongoose inner-query

我想创建一个聚合管道,其中一个匹配项使用其他集合(内部查询)的结果。这是一个例子:

db.users.aggregate([
    {"$match":{"id":{"$in":["0","1","2"]},"p": {$in: db.groups.distinct("p", {"enable":true)}}},
    {"$group":{"_id":"$v","number":{"$sum":1}}}
])

我需要从javascript进行查询。实际上,该应用程序是 nodejsmongoose

不幸的是,当 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/

相关文章:

javascript - 基于React/Redux逻辑渲染容器

JavaScript/WebSQL : how to cancel query

node.js - 如何在 HTTP 中发送大写 header

javascript - 扩展 typescriptdefineTyped 定义文件

java - 如何加载javascript文件并在java中运行javascript方法?

javascript - 使用window.print()时如何添加水印?

javascript - nodejs变量仅在函数和子函数中

mongodb - MongoDB 中的 geoNear 可以返回文档中的字段子集吗?

mongodb获取不同的记录

mongodb - 我在更新中对 $set 和 $inc 做错了什么