我想为一个非常动态的集合构建一个查询。
一个例子:
我有一个像
这样的集合{
_id: ObjectId(),
value: x
// some other data
}
示例数据集的值为
{
value: 1
},
{
value: 1
},
{
value: 2
},
{
value: 3
},
{
value: 3
}
正如您所看到的那样,可以多次使用相同的值。
但如果我运行以下查询,它只会返回第一个value: 3
db.collection.aggregate([
{
$sort: "$value"
},
{
$limit: 4
}
])
但我想要的是至少4个文件,其中包括所有出现的值。所以我想要所有value: 3
。
对不起,这个问题可能有点误导。我希望得到一个完整的结果。所有有价值的东西:3。它是公共交通数据库,价值是出发时间。所以我至少需要接下来的30次离场,但是如果30和31同时离开,我也想要31次。
答案 0 :(得分:1)
我现在使用一个小python函数,它可以扩展我想要的限制。由于查询返回游标我不浪费资源。我没有在查询中指定限制。
def extend_limit(cursor, original_limit):
result = []
try:
while original_limit > 0:
result.append(cursor.next())
original_limit -= 1
last_element = result[-1]
while True:
next_element = next(cursor)
if last_element['value'] != next_element['value']:
break
result.append(next_element)
except StopIteration:
pass
return result
答案 1 :(得分:0)
此处无需使用聚合,只需使用投影,排序和限制执行普通find
:
db.collection.find({}, {_id : 0, value : 1}).sort({value : 1}).limit(4)
我建议您实际查询某些条件(而不是在我的示例中为空),并且条件具有适当的索引,如果可能,包括排序字段(出于性能原因)。