【问题标题】:Aggregate query in mongo works, does not in Pymongomongo 中的聚合查询有效,Pymongo 中没有
【发布时间】:2016-11-03 03:56:46
【问题描述】:

我遇到了一个问题。我尝试通过“COL”数组之外的 LOC 标识符查询此文档以获取数量和组的总和。

{
"_id" : ObjectId("57506d74c469888f0d631be6"),
"LOC" : "User001",
"COL" : [ 
    {
        "date" : "25/03/2016",
        "number" : "Folio009",
        "amount" : 100
    }, 
    {
        "date" : "25/04/2016",
        "number" : "Folio010",
        "amount" : 100
    }

] }

此命令在 mongo 中有效,但我无法通过 Pymongo 包使其在 Python 中有效:

Mongo 查询(工作)

db.perfiles.aggregate({"$unwind": "$COL"},
{ "$group": { _id: "$LOC", "sum" : {"$sum" : "$COL.amount" }}})

Pymongo(不工作)

from pymongo import MongoClient

client = MongoClient()

db = client['temporal']

docs = db.perfiles


pipeline = [{"$unwind": "$COL"},
     {"$group": {"_id": "$LOC", "count": {"$sum": "$COL.amount"}}}
          ]

list(db.docs.aggregate(pipeline))

有什么建议可以在 Pymongo 中查询相同的查询吗?谢谢!

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    我假设您在 Python 中与 MongoDB 建立了有效连接。
    下面的代码 sn -p 会返回一个 MongoDB 游标在result.

    pipeline = [
        {"$unwind": "$COL"},
        {"$group": {"_id": "$LOC", "sum": {"$sum": "$COL.amount"}}}
    ]
    
    cursor = collection.aggregate(pipeline)
    

    现在您可以将cursor 转换为列表

    result = list(cursor)
    

    如果您打印结果的值,您将得到与 Shell 查询完全相同的结果。

    [{u'sum': 200.0, u'_id': u'User001'}]
    

    更新

    我看到您在 python 代码中将aggregate 函数调用为db.docs.aggregate(pipeline)。 您需要将其称为docs.aggregate...,而不需要db。见上面的例子。

    【讨论】:

    【解决方案2】:
    MongoDB Enterprise > db.test.aggregate([{$match:{name:'prasad'}},{$group : {_id : "$name", age : {$min : "$age"}}}]);
    { "_id" : "prasad", "age" : "20" }
    MongoDB Enterprise > db.test.find()
    { "_id" : ObjectId("5890543bce1477899c6f05e8"), "name" : "prasad", "age" : "22" }
    { "_id" : ObjectId("5890543fce1477899c6f05e9"), "name" : "prasad", "age" : "21" }
    { "_id" : ObjectId("58905443ce1477899c6f05ea"), "name" : "prasad", "age" : "20" }
    { "_id" : ObjectId("5890544bce1477899c6f05eb"), "name" : "durga", "age" : "20" }
    { "_id" : ObjectId("58905451ce1477899c6f05ec"), "name" : "durga", "age" : "21" }
    { "_id" : ObjectId("58905454ce1477899c6f05ed"), "name" : "durga", "age" : "22" }
    MongoDB Enterprise >    
    
    
    ############code
    
    
    import pymongo
    from pymongo import MongoClient
    client=MongoClient("localhost:27017")
    db=client.prasad      #####prasad is dbname, test is collection name
    nameVar='prasad'
    aggregation_string=[{"$match":{"name":nameVar}},{"$group" : {"_id" : "$name", "age" : {"$min" : "$age"}}}]
    x=db.test.aggregate(aggregation_string)
    print x
    for r in x:
            min_age=r.items()[0]
            print(min_age[1])      #######output:      20
    

    【讨论】:

    • 如果我想搜索所有集合怎么办?
    【解决方案3】:
    you are in a right track but add one more statement it will be fine.
    
        from pymongo import MongoClient
    
        client = MongoClient()
    
        db = client['temporal']
    
        docs = db.perfiles
    
    
        pipeline = [{"$unwind": "$COL"},
             {"$group": {"_id": "$LOC", "count": {"$sum": "$COL.amount"}}}
              ]
    
        result = list(db.docs.aggregate(pipeline))
    
        for i in result:
    
            sum += i['sum']
    
        print(sum)
    
    

    【讨论】:

      猜你喜欢
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多