Python Pymongo中的MongoDB查询

Python Pymongo中的MongoDB查询,python,mongodb,aggregation-framework,pymongo,Python,Mongodb,Aggregation Framework,Pymongo,我有一个以下格式的收藏: { "name": ...., "users": [....,....,....,....] } 我有两个不同的名字,我想找到属于这两个文档的用户总数。现在,我正在用Python来做这件事。我下载名为1的文档和名为2的文档,并检查这两个文档中有多少用户。我想知道是否有其他方法只使用MongoDB并返回号码 例如: { "name": "John", "users": ["001","003","008","010"] } { "name": "Peter", "us

我有一个以下格式的收藏:

{
"name": ....,
"users": [....,....,....,....]
}
我有两个不同的名字,我想找到属于这两个文档的用户总数。现在,我正在用Python来做这件事。我下载名为1的文档和名为2的文档,并检查这两个文档中有多少用户。我想知道是否有其他方法只使用MongoDB并返回号码

例如:

{
"name": "John",
"users": ["001","003","008","010"]
}

{
"name": "Peter",
"users": ["002, "003", "004","005","006","008"]
}
结果将是
2
,因为用户003和008都属于这两个文档

我是如何做到的:

doc1 = db.collection.find_one({"name":"John"})
doc2 = db.collection.find_one({"name":"Peter"})

total = 0
for user in doc1["users"]:
    if user in doc2["users"]:
       total += 1

您也可以使用,但我认为只有在超过两个用户的情况下才有意义,即使您可以这样使用:

db.users.aggregate([
    { "$match": {
         "name": { "$in": [ "John", "Peter" ] }
    }},

    { "$unwind": "$users" },
    { "$group": {
        "_id": "$users",
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }},
    { "$group": {
        "_id": null,
        "count": { "$sum": 1 }
    }}
])

这允许您在中找到与您提供的名称相同的计数。我没有更改数据库方案的选项。这是一个过程,我每隔一段时间只需要运行一次,并且在每个名称组合中都会执行。@Sfinos我想你误读了,就像我自己误读一样,你在编辑之间抓住了我。这是使用聚合方法跨用户匹配条目。你说得对。我的评论是针对你之前的回答(userCount)。因为我不熟悉聚合,你知道哪一个更快吗?Python还是MongoDB解决方案?@Sfinos聚合方法应该更快,如果不仅仅是因为您没有同时获取两条记录的话。如果您想在两个以上的用户中执行此操作,只需在中提供更多的It
$,它也可以轻松扩展。在本例中,与您的
.findOne
查询一样,重要的是为“name”字段编制索引。文档的答案中有一些链接。Pymongo语法与图中所示相差不大