查找中的条件,Mongo
Conditions in Find, Mongo
我有一个 mongo 集合,文档如下:-
{
"_id" : ObjectId("55a9378ee2874f0ed7b7cb7e"),
"_uid" : 10,
"impressions" : [
{
"pos" : 6,
"id" : 123,
"service" : "furniture"
},
{
"pos" : 0,
"id" : 128,
"service" : "electronics"
},
{
"pos" : 2,
"id" : 127,
"service" : "furniture"
},
{
"pos" : 2,
"id" : 125,
"service" : "electronics"
},
{
"pos" : 10,
"id" : 124,
"service" : "electronics"
}
]
},
{
"_id" : ObjectId("55a9378ee2874f0ed7b7cb7f"),
"_uid" : 11,
"impressions" : [
{
"pos" : 1,
"id" : 124,
"service" : "furniture"
},
{
"pos" : 10,
"id" : 124,
"service" : "electronics"
},
{
"pos" : 1,
"id" : 123,
"service" : "furniture"
},
{
"pos" : 21,
"id" : 122,
"service" : "furniture"
},
{
"pos" : 3,
"id" : 125,
"service" : "electronics"
},
{
"pos" : 10,
"id" : 121,
"service" : "electronics"
}
]
}
我的目标是找到特定 "service"
中的所有 "id"
说 "furniture"
即得到这样的结果:
[122,123,124,127]
但我不知道如何在
中构建条件
db.collection_name.find()
由于难以为数组中的第 'n' 个元素设置条件,"impressions[n]":"value"
.
一个选项是使用获得的 "id"
s 执行聚合操作来查找服务的每个 "id"
的展示次数,正如我之前提出的这个问题的答案所建议的那样:-
。
但我只想要服务中不同 'id'
的列表,而不是印象。
请帮忙!
您需要 aggregration framework 以获得有意义的结果。像这样:
result = db.collection.aggregate([
{ "$match": {
"impressions.service": "furniture"
}},
{ "$unwind": "$impressions" },
{ "$match": {
"impressions.service": "furniture"
}},
{ "$group": {
"_id": "$impressions.id"
}}
])
或者更好的是 MongoDB 2.6 或更高版本,它可以删除不匹配的数组项 "prior" 到 $unwind
with $redact
:
result = db.collection.aggregate([
{ "$match": {
"impressions.service": "furniture"
}},
{ "$redact": {
"$cond": {
"if": {
"$eq": [
{ "$ifNull": [ "$service", "furniture" ] },
"furniture"
]
},
"then": "$$DESCEND",
"else": "$$PRUNE"
}
}},
{ "$unwind": "$impressions" },
{ "$group": {
"_id": "$impressions.id"
}}
])
产生:
{ "_id" : 122 }
{ "_id" : 124 }
{ "_id" : 127 }
{ "_id" : 123 }
不是普通的"list",只是改造一下,所以:
def mapper (x):
return x["_id"]
map(mapper,result)
或者:
map(lambda x: x["_id"], result)
送给你:
[122, 124, 127, 123]
如果你想要它 "sorted" 那么要么在聚合管道的末尾添加一个 $sort
阶段,要么在代码中对结果列表进行排序。
我有一个 mongo 集合,文档如下:-
{
"_id" : ObjectId("55a9378ee2874f0ed7b7cb7e"),
"_uid" : 10,
"impressions" : [
{
"pos" : 6,
"id" : 123,
"service" : "furniture"
},
{
"pos" : 0,
"id" : 128,
"service" : "electronics"
},
{
"pos" : 2,
"id" : 127,
"service" : "furniture"
},
{
"pos" : 2,
"id" : 125,
"service" : "electronics"
},
{
"pos" : 10,
"id" : 124,
"service" : "electronics"
}
]
},
{
"_id" : ObjectId("55a9378ee2874f0ed7b7cb7f"),
"_uid" : 11,
"impressions" : [
{
"pos" : 1,
"id" : 124,
"service" : "furniture"
},
{
"pos" : 10,
"id" : 124,
"service" : "electronics"
},
{
"pos" : 1,
"id" : 123,
"service" : "furniture"
},
{
"pos" : 21,
"id" : 122,
"service" : "furniture"
},
{
"pos" : 3,
"id" : 125,
"service" : "electronics"
},
{
"pos" : 10,
"id" : 121,
"service" : "electronics"
}
]
}
我的目标是找到特定 "service"
中的所有 "id"
说 "furniture"
即得到这样的结果:
[122,123,124,127]
但我不知道如何在
中构建条件db.collection_name.find()
由于难以为数组中的第 'n' 个元素设置条件,"impressions[n]":"value"
.
一个选项是使用获得的 "id"
s 执行聚合操作来查找服务的每个 "id"
的展示次数,正如我之前提出的这个问题的答案所建议的那样:-
但我只想要服务中不同 'id'
的列表,而不是印象。
请帮忙!
您需要 aggregration framework 以获得有意义的结果。像这样:
result = db.collection.aggregate([
{ "$match": {
"impressions.service": "furniture"
}},
{ "$unwind": "$impressions" },
{ "$match": {
"impressions.service": "furniture"
}},
{ "$group": {
"_id": "$impressions.id"
}}
])
或者更好的是 MongoDB 2.6 或更高版本,它可以删除不匹配的数组项 "prior" 到 $unwind
with $redact
:
result = db.collection.aggregate([
{ "$match": {
"impressions.service": "furniture"
}},
{ "$redact": {
"$cond": {
"if": {
"$eq": [
{ "$ifNull": [ "$service", "furniture" ] },
"furniture"
]
},
"then": "$$DESCEND",
"else": "$$PRUNE"
}
}},
{ "$unwind": "$impressions" },
{ "$group": {
"_id": "$impressions.id"
}}
])
产生:
{ "_id" : 122 }
{ "_id" : 124 }
{ "_id" : 127 }
{ "_id" : 123 }
不是普通的"list",只是改造一下,所以:
def mapper (x):
return x["_id"]
map(mapper,result)
或者:
map(lambda x: x["_id"], result)
送给你:
[122, 124, 127, 123]
如果你想要它 "sorted" 那么要么在聚合管道的末尾添加一个 $sort
阶段,要么在代码中对结果列表进行排序。