【问题标题】:Get distinct levels of array field in MongoDb在 MongoDb 中获取不同级别的数组字段
【发布时间】:2017-02-10 01:33:58
【问题描述】:

我有一个如下所示的 mongo 表:

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

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

[
  [ 1, 0 ],
  [ 2, 0 ]
]

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

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

【问题讨论】:

  • 问题是这些是数组值。如果你有像 [ [ 1, 0 ] ] 这样的配对,那么 db.woohoo.distinct('id_pair') 会按预期工作。

标签: mongodb mongodb-query aggregation-framework pymongo


【解决方案1】:

您需要运行一个聚合操作,将所有文档作为一个整体进行分组,然后使用 $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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多