我将pymongo版本3.7.2与python 3.6.8一起使用。我的数据库中有以下格式的文档:
{"_id" : 1,
"main_array":[
{"subid":222,
"subarray":[{"name":"hari","status":1},{"name":"henry","status":1}]
},
{"subid":333,
"subarray":[{"name":"james","status":0},{"name":"jason","status":1}]
}]
},
{"_id" : 2,
"main_array":[
{"subid":222,
"subarray":[{"name":"alex","status":1},{"name":"anna","status":1}]
},
{"subid":333,
"subarray":[{"name":"bob","status":0},{"name":"bunny","status":1}]
}]
}
我需要从集合中的所有文档中获取subid = 222的对象。所需结果应如下:
{"_id" : 1,
"main_array":[
{"subid":222,
"subarray":[{"name":"hari","status":1},{"name":"henry","status":1}]
}]
},
{"_id" : 2,
"main_array":[
{"subid":222,
"subarray":[{"name":"alex","status":1},{"name":"anna","status":1}]
}]
}
我尝试了以下代码:
myclient = pymongo.MongoClient(<mongoclient url>)
mydb = myclient["test"]
mycol = mydb["user"]
subid = 222
_id = 1
x = mycol.find({"_id":_id},{"main_array":{"$elemMatch":{"subid":subid}}})
我得到了特定文档所需的结果。但是我需要所有文件。我尝试了以下查询:
x = mycol.find({"main_array":{"$elemMatch":{"subid":subid}}})
但是这次它将返回整个集合。我想念什么?
答案 0 :(得分:0)
elemMatch
为您提供文档,其中任何数组项都通过该条件。
您应将聚合管道与$unwind
和$match
一起使用。
基本上,做:
db.collection.aggregate([{
$unwind: "$main_array"
},
{
$match: {
"main_array.subid": 222
}
}])
这虽然将main_array
作为对象,但是您应该可以使用它。
以上内容的输出
[
{
"_id": 1,
"main_array": {
"subarray": [
{
"name": "hari",
"status": 1
},
{
"name": "henry",
"status": 1
}
],
"subid": 222
}
},
{
"_id": 2,
"main_array": {
"subarray": [
{
"name": "alex",
"status": 1
},
{
"name": "anna",
"status": 1
}
],
"subid": 222
}
}
]