我有两个系列

帖子:

{
    "_Id": "1",
    "_PostTypeId": "1",
    "_AcceptedAnswerId": "192",
    "_CreationDate": "2012-02-08T20:02:48.790",
    "_Score": "10",
    ...
    "_OwnerUserId": "6",
    ...
},
...

和用户:

{
    "_Id": "1",
    "_Reputation": "101",
    "_CreationDate": "2012-02-08T19:45:13.447",
    "_DisplayName": "Geoff Dalgas",
    ...
    "_AccountId": "2"
},
...

我想找到写5到15篇文章的用户.

db.posts.aggregate([
    {
        $lookup: {
            from: "users", 
            localField: "_OwnerUserId",
            foreignField: "_AccountId", 
            as: "X"
        }
    },  
    {
        $group: {
            _id: "$X._AccountId", 
            posts: { $sum: 1 }
        }
    },   
    {
        $match : {posts: {$gte: 5, $lte: 15}}
    },  
    {
        $sort: {posts: -1 }
    },
    {
        $project : {posts: 1}
    }
])

而且速度非常慢.对于6k用户和10k帖子,它需要40秒才能得到响应,而在关系数据库中,我在一瞬间得到响应.

推荐答案

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

foreignField指定from中文档中的字段

这将与任何其他查询一样执行.

如果您在字段_AccountId上没有索引,它将对10000篇文章中的每一篇进行完整的tablescan查询.大部分时间都会花在那个桌子上.

db.users.ensureIndex("_AccountId", 1) 

加快进程,因此它可以进行10000次索引点击,而不是10000次表扫描.

Mongodb相关问答推荐

更新查询mongoose 中的礼宾更新字段

如何获取mongodb ObjectId的值?

mongoDB文档数组字段中的唯一项如何

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

如何聚合过滤器嵌套文档并从其他字段中获取值

如何将查询结果(单个文档)存储到变量中?

使用模拟 MongoDB 服务器进行单元测试

mongodb,pymongo,aggregate聚合给出奇怪的输出

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

Clojure 和 NoSQL 数据库

从性能Angular 来看 MongoDB 嵌入式与参考

在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流

带有排序功能的mongoose findOne

将 MongoDB 数据库复制到本地计算机

在 mongodb 中的索引列上查找重复项的快速方法

初创公司应该考虑哪些数据库系统?

MongoDb 连接被拒绝

我可以使用字符串作为 mongodb 文档的 ID 类型吗?

用于 MongoDB 的 Node.js 模块

Mongodb Compass 无法在 Ubuntu 18.10 中打开