找到mongo文档而忽略重复值mongo side

时间:2017-02-09 11:34:08

标签: mongodb mongodb-query pymongo

(问题受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端完成“忽略重复”部分,从而节省内存和数据传输时间。

1 个答案:

答案 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'。

的顺序之前