具有完整行对象的Mongo Distinct查询

Cyb*_*ova 4 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'}
Run Code Online (Sandbox Code Playgroud)

你可以看到一些行是重复的,具有不同的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'}
Run Code Online (Sandbox Code Playgroud)

我的查询

keys = db.collection.distinct('key', {})
all_data = db.collection.find({'key': {$in: keys}})
Run Code Online (Sandbox Code Playgroud)

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

我还可以创建一个unique keykey但价值这么长时间(152个字符),它不会帮我.

还是会?

Ale*_*lex 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"
  }
}])
Run Code Online (Sandbox Code Playgroud)