我正在实施一个排名系统。我有一个包含这样的元素的集合:
{"_id" : 1, "count" : 32}
{"_id" : 2, "count" : 12}
{"_id" : 3, "count" : 34}
{"_id" : 4, "count" : 9}
{"_id" : 5, "count" : 77}
{"_id" : 6, "count" : 20}
我想编写一个返回一个元素的查询,该元素包含{"id" : 1}
和另外两个邻居元素(按count排序后)。总共返回了3个元素。
例: 排序后:
9 12 20 32 34 77
查询应返回20 32 34
。
答案 0 :(得分:4)
您永远不会在单个查询操作中获得此功能,但可以使用"三个"查询。第一个获得" count"的值从所需的元素,以及随后的元素中找到"前面的"和"关注"值。
var result = [];
var obj = db.collection.findOne({ "_id": 1 }); // returns object as selected
result.push(obj);
// Preceding
result.unshift(db.collection.findOne({
"$query": { "count": { "$lt": obj.count } },
"$orderby": { "count": -1 }
}));
// Following
result.push(db.collection.findOne({
"$query": { "count": { "$gt": obj.count } },
"$orderby": { "count": 1 }
}));
要求在单一查询中执行此操作"本质上是要求加入"这是MongoDB基本上不做的事情。它是离散结果的"Set Intersection",而在SQL中基本上是一个" join"操作