(问题受this one启发)
给定数据集:
db.mycollection.insert([
{a:1, b:2, c:3},
{a:1, b:3, c:4},
{a:0, b:1, c:3},
{a:3, b:2, c:4}
{a:4, b:1, c:4}
])
我想找到一个键的给定值(比如一个应该在0到3之间)和一个只有一个文档,并忽略该值的后续查找,即如果一个文档已找到a的值1,搜索不应返回任何带有1作为a键值的文档。调查结果的顺序可以通过另一个密钥的值来确定。
在我们的示例中,预期输出将为:
# Findings are sorted by value of the b key
[{a:0, b:1, c:3}, {a:3, b:2, c:4}, {a:1, b:2, c:3}]
这是我工作的代码,然后我不得不从我这边删除副本而不是mongo。
import pymongo, pandas
result = dict(db.mycollection.find({'a': {'$in': [i for i in range(4)]}}).sort('b', pymongo.ASCENDING))
print(result)
>>> [{a:0, b:1, c:3}, {a:3, b:2, c:4}, {a:1, b:2, c:3}, {a:1, b:3, c:4}]
由于我使用的是一个可能包含数百万个文档的集合,因此我需要在mongo端完成“忽略重复”部分,从而节省内存和数据传输时间。
答案 0 :(得分:0)
来自Veeram的评论:
l = [i for i in range(4)]
result = db.mycollection.aggregate([{'$sort': {'b': 1}},
{'$group': {
'_id': '$a',
'data': {'$first': '$$ROOT'}
}
},
{'$match': {'_id': {'$in': l}}}])
result_list = [i['data'] for i in result]
print(result_list) # Omitted the ObjectId that should appear too
>>>[{'a': 3, 'b': 2, 'c': 4},
{'a': 1, 'b': 2, 'c': 3},
{'a': 0, 'b': 1, 'c': 3}]
这似乎对我有用,你只需注意到你的结果不一定按照' b'密钥,因为它遍历' a'在查看' b'。
的顺序之前