在MongoDb中获取不同级别的数组字段

时间:2017-02-07 14:37:58

标签: mongodb mongodb-query aggregation-framework pymongo

我有一个mongo表,看起来像这样:

40 00 14 81 25 00 A0 65 00 00 00 26
40 00 14 81 25 00 A0 68 00 00 07 30
40 00 14 81 25 04 28 65 00 00 00 2A
40 00 14 81 25 04 28 68 00 00 00 2D
40 00 14 81 25 04 28 68 00 00 02 2F
40 00 14 81 25 04 28 68 00 00 03 30
40 00 14 81 25 04 28 68 00 00 04 31
40 00 14 81 25 04 28 68 00 00 05 32
40 00 14 81 25 04 28 68 00 00 07 34
40 00 14 81 25 04 28 69 00 00 01 2F
40 00 14 81 25 04 A0 68 00 00 07 34
40 00 14 81 25 08 9A 68 00 00 07 41
40 00 14 81 25 08 9C 68 00 00 07 43
40 00 14 81 25 08 9E 68 00 00 07 45
40 00 14 81 25 08 A0 68 00 00 00 31
40 00 14 81 25 08 A0 68 00 00 01 32
40 00 14 81 25 08 A0 68 00 00 02 33
40 00 14 81 25 08 A0 68 00 00 03 34
40 00 14 81 25 08 A0 68 00 00 07 38
40 00 14 81 25 08 A2 68 00 00 07 3A
40 00 14 81 25 08 A4 68 00 00 07 3C
40 00 14 81 25 08 A6 68 00 00 07 3E
40 00 14 81 25 08 A8 68 00 00 07 40
40 00 14 81 25 08 AA 68 00 00 07 42
40 00 14 81 25 08 AC 68 00 00 07 44
40 00 14 81 25 08 AE 68 00 00 07 46
40 00 14 81 25 09 A0 68 00 00 07 39
40 00 14 81 25 0A A0 68 00 00 07 3A
40 00 14 81 25 0C A0 68 00 00 07 3C
40 00 14 81 25 40 18 65 00 00 00 29
40 00 14 81 25 40 1A 65 00 00 00 2B
40 00 14 81 25 40 1C 65 00 00 00 2D
40 00 14 81 25 40 1E 65 00 00 00 2F
40 00 14 81 25 40 20 65 00 00 00 22
40 00 14 81 25 40 22 65 00 00 00 24
40 00 14 81 25 40 24 65 00 00 00 26
40 00 14 81 25 40 26 65 00 00 00 28
40 00 14 81 25 40 28 65 00 00 00 2A
40 00 14 81 25 40 2A 65 00 00 00 2C
40 00 14 81 25 40 2C 65 00 00 00 2E
40 00 14 81 25 40 2E 65 00 00 00 30
40 00 14 81 25 40 30 65 00 00 00 23
40 00 14 81 25 40 32 65 00 00 00 25
40 00 14 81 25 40 34 65 00 00 00 27
40 00 14 81 25 40 34 68 00 00 04 2E
40 00 14 81 25 80 1C 68 00 00 00 34
40 00 14 81 25 80 20 65 00 00 00 26
40 00 14 81 25 C0 20 65 00 00 00 2A
40 00 14 81 25 C0 28 68 00 00 02 37

我想查询该表以获取“id_pair”字段的所有不同级别,即:

[
  { "_id" : ObjectId("5899d847c014c5287df3819a"), "id_pair" : [ 1, 0 ]},
  { "_id" : ObjectId("5899d847c014c5287df3819b"), "id_pair" : [ 2, 0 ]
]

我尝试使用[ [ 1, 0 ], [ 2, 0 ] ] ,但会返回db.woohoo.distinct('id_pair')

有没有办法返回“id_pair”因子的所有级别?我使用pymongo作为我的ORM,所以它支持这种查询的任何语法糖都是奖励。

1 个答案:

答案 0 :(得分:2)

您需要运行一个聚合操作,将所有文档整体分组,然后使用 $addToSet 创建不同的集合,如下所示:

Mongo Shell

db.woohoo.aggregate([
    {
        "$group": {
            "_id": 0,
            "distinct_pairs": { "$addToSet": "$id_pair" }                
        }
    }
])

示例输出

{
    "_id" : 0,
    "distinct_pairs" : [
        [ 1, 0 ],
        [ 2, 0 ]
    ]
}

pymongo聚合操作示例

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['somedb']
collection = db.woohoo

pipe = [{'$group': {'_id': 0, 'distinct_pairs': {'$addToSet': '$id_pair'}}}]

result = next(collection.aggregate(pipeline=pipe))['distinct_pairs']
print(result)
client.close()