如何在 MongoDB 中查找和计数特定项目?
How to find and count in MongoDB for specific items?
我想计算以下 JSON 我从 MongoDB 中提取的结果中与每个 ID 关联的每种类型的响应的总数:
{
"test": [
{
"ID": 4,
"response": "A"
},
{
"ID": 4,
"response": "B"
},
{
"ID": 1,
"response": "A"
},
{
"ID": 3,
"response": "B"
},
{
"ID": 2,
"response": "C"
}
]
}
// and so on...
例如,我想将 JSON 结构化为如下形式:
{
"test": [
{
"ID": 4,
"A": 1,
"B": 1
},
{
"ID": 3,
"B": 1
},
{
"ID": 2,
"C": 1
},
{
"ID": 1,
"A": 1
}
]
}
我的查询看起来像这样,因为我只是在测试并尝试统计 ID 4 的响应。
surveyCollection.find({"ID":4},{"ID":1,"response":1,"_id":0}).count():
但我收到以下错误:TypeError: 'int' object is not iterable
你需要的是使用 "aggregation framework"
surveyCollection.aggregate([
{"$unwind": "$test" },
{"$group": {"_id": "$test.ID", "A": {"$sum": 1}, "B": {"$sum": 1}}},
{"$group": {"_id": None, "test": {"$push": {"ID": "$ID", "A": "$A", "B": "$B"}}}}
])
来自 pymongo 3.x aggregate()
method returns a CommandCursor
结果集,因此您可能需要先将其转换为列表。
In [16]: test
Out[16]: <pymongo.command_cursor.CommandCursor at 0x7fe999fcc630>
In [17]: list(test)
Out[17]:
[{'_id': None,
'test': [{'A': 1, 'B': 1},
{'A': 1, 'B': 1},
{'A': 1, 'B': 1},
{'A': 2, 'B': 2}]}]
改用return list(test)
我想计算以下 JSON 我从 MongoDB 中提取的结果中与每个 ID 关联的每种类型的响应的总数:
{
"test": [
{
"ID": 4,
"response": "A"
},
{
"ID": 4,
"response": "B"
},
{
"ID": 1,
"response": "A"
},
{
"ID": 3,
"response": "B"
},
{
"ID": 2,
"response": "C"
}
]
}
// and so on...
例如,我想将 JSON 结构化为如下形式:
{
"test": [
{
"ID": 4,
"A": 1,
"B": 1
},
{
"ID": 3,
"B": 1
},
{
"ID": 2,
"C": 1
},
{
"ID": 1,
"A": 1
}
]
}
我的查询看起来像这样,因为我只是在测试并尝试统计 ID 4 的响应。
surveyCollection.find({"ID":4},{"ID":1,"response":1,"_id":0}).count():
但我收到以下错误:TypeError: 'int' object is not iterable
你需要的是使用 "aggregation framework"
surveyCollection.aggregate([
{"$unwind": "$test" },
{"$group": {"_id": "$test.ID", "A": {"$sum": 1}, "B": {"$sum": 1}}},
{"$group": {"_id": None, "test": {"$push": {"ID": "$ID", "A": "$A", "B": "$B"}}}}
])
来自 pymongo 3.x aggregate()
method returns a CommandCursor
结果集,因此您可能需要先将其转换为列表。
In [16]: test
Out[16]: <pymongo.command_cursor.CommandCursor at 0x7fe999fcc630>
In [17]: list(test)
Out[17]:
[{'_id': None,
'test': [{'A': 1, 'B': 1},
{'A': 1, 'B': 1},
{'A': 1, 'B': 1},
{'A': 2, 'B': 2}]}]
改用return list(test)