缓慢的mongodb查询,如何发生?

时间:2019-06-05 10:50:05

标签: mongodb

我在MongoDB中有以下查询:

notifydataSetChanged

忘记字段含义。而且我有这个索引:

db.getCollection('message').aggregate([
 {
     "$match": {
         "who" : { "$in" : ["manager", "woker"] },
         "sendTo": { "$in": ["userId:243369", "userId:160921"] },
         "exceptSendTo": { "$nin": ["userId:37355"] },
         "msgTime": { "$lt": 1559716155 },
         "isInvalid": { "$exists": false }
      }
 },
 {
     "$sort": { "msgTime": 1, "who": 1, "sendTo": 1 }
 },
 {
     "$group": { "_id": "$who", "doc": { "$first": "$type" } }
 }

], { allowDiskUse: true})

执行上面的查询,花费1.52s,使用说明看它确实使用了msgTime_1.0_who_1.0_sendTo_1.0索引。

为什么使用索引后查询仍然很低?有什么办法可以解决诸如变化指数之类的低问题?

1 个答案:

答案 0 :(得分:0)

我不认为您打算一直使用排序。 $ firs参数需要对实际的第一个论点进行排序 https://docs.mongodb.com/manual/reference/operator/aggregation/first/

您需要对想要第一个元素的键进行排序。 或者您可以使用$$ ROOT,女巫将返回第一个文档。

我认为您应该将其修改为:

{"$sort": {"who": 1, "msgTime": 1, "sendTo": 1}},
{"$group": {"_id": "$who", "doc": {"$first": "$$root"}}},

在这种情况下,$ group运算符可以立即“找到”每个组的结果,因为它们彼此相邻。

如果仅对类型感兴趣,请添加投影:

{'$project': {'doc.type': 1}