mongo中的聚合查询有效,而Pymong中没有

2024-06-02 07:50:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个问题。我试图查询此文档以获取金额和“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中有效,但我无法使它在Python中与Pymongo包一起工作:

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中查询同一个查询吗?谢谢!


Tags: clientidnumberdbdategroupcolamount
3条回答
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
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)

我假设您在Python中有到MongoDB的有效连接。
以下代码段将在result.中返回MongoDB游标

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。见上面的例子。

相关问题 更多 >