我在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索引。
为什么使用索引后查询仍然很低?有什么办法可以解决诸如变化指数之类的低问题?
答案 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}