具有完整行对象

时间:2016-03-08 20:14:20

标签: python mongodb pymongo

首先我是mongo的新手,所以我不太了解,我不能仅仅因为某些依赖而删除重复的行。

我有以下数据存储在mongo

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'},
{'id': 2, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'},
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'},
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'},
{'id': 5, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'}

你可以看到一些行是重复的,具有不同的id 只要从输入中解决这个问题我就必须在输出上解决它。

我需要以下列方式获取数据:

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'},
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'},
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'}

我的查询

keys = db.collection.distinct('key', {})
all_data = db.collection.find({'key': {$in: keys}})

正如您所看到的,对同一结果集需要两次查询请将其合并为一个,因为数据库非常大

我可能还会在unique key上创建一个key,但该值太长(152个字符),对我没用。

或者它会??

1 个答案:

答案 0 :(得分:5)

您需要使用聚合框架。有多种方法可以做到这一点,下面的解决方案使用$$ROOT变量来获取每个组的第一个文档:

db.data.aggregate([{
  "$sort": {
    "_id": 1
  }
}, {
  "$group": {
    "_id": "$key",
    "first": {
      "$first": "$$ROOT"
    }
  }
}, {
  "$project": {
    "_id": 0,
    "id":"$first.id",
    "key":"$first.key",
    "name":"$first.name",
    "country":"$first.country"
  }
}])