我的mongo实例中有一个文档格式如下,
{
"_id" : "08d4a242-08fb-07f7-46e5-8717a81d5b70",
"fname" : "john",
"created_date" : ISODate("2017-05-24T01:13:06.829Z"),
"customProp" : [
[
"customX","{\"some data related to X \"}"
],
[
"customY","{\"some data related to Y \"}"
],
[
"customZ","{\"some data related to Z \"}"
]
]
}
元素/值,例如" customX"," customY" &安培; " customZ"并不一定在所有文件中。如何检索" customProp"的第二个元素中的所有值数组,在本文档中包含" customZ"?
我可以使用以下查询过滤&找到所有有" customZ"元件,
db.getCollection('col1').find({$and : [{"customProp":{$elemMatch:{0:"customZ"}}}, {"created": { $gte: ISODate("2017-05-22T00:00:00.000Z") }}] },{"created":1}).limit(1) .pretty()
输出:
{
"_id" : "08d4a242-08fb-07f7-46e5-8717a81d5b45",
"created" : ISODate("2017-05-24T01:13:06.829Z")
}
但找到一种方法来检索数组第二个元素中的所有值,其中第一个值是" customZ"。
预期结果:
{
"_id" : "08d4a242-08fb-07f7-46e5-8717a81d5b45",
"created" : ISODate("2017-05-24T01:13:06.829Z"),
"customPro": ["customZ","{\"some data related to Z \"}"]
}
如果我的查询只返回
,我很好{
"{\"some data related to Z \"}"
}
答案 0 :(得分:1)
这是一个嵌套数组,这不是一个好主意,但实际上你将元素与$elemMatch
表达式匹配,所以你确实得到了"外部"数组customProp
,允许您使用positional $
operator投影:
db.getCollection('coll1').find(
{
"customProp":{ "$elemMatch": { "0": "customZ" } },
"created_date": { "$gte": ISODate("2017-05-22T00:00:00.000Z") }
},
{ "created_date": 1, "customProp.$": 1 }
)
产生结果:
{
"_id" : "08d4a242-08fb-07f7-46e5-8717a81d5b70",
"created_date" : ISODate("2017-05-24T01:13:06.829Z"),
"customProp" : [
[
"customZ",
"{\"some data related to Z \"}"
]
]
}
其中customProp
当然仍在嵌套数组中,但在python中处理单个文档时,您只需访问数组索引处的属性:
doc['customProp'][0][1]
当然会返回值:
'{"some data related to Z "}'
同样适用于JavaScript,这在语法上基本相同。作为shell示例:
db.getCollection('coll1').find(
{
"customProp":{ "$elemMatch": { "0": "customZ" } },
"created_date": { "$gte": ISODate("2017-05-22T00:00:00.000Z") }
},
{ "created_date": 1, "customProp.$": 1 }
).map(function(doc) {
doc['customProp'] = doc['customProp'][0][1];
return doc;
})
输出:
{
"_id" : "08d4a242-08fb-07f7-46e5-8717a81d5b70",
"created_date" : ISODate("2017-05-24T01:13:06.829Z"),
"customProp" : "{\"some data related to Z \"}"
}
此处的位置$
投影确保返回的数组中只有一个元素,因此从所有文档结果中提取的符号始终相同。因此,您从数据库中获取匹配的元素,并通过代码提取属性。
另请注意,此处不需要$and
,因为所有查询参数都已经是AND条件。这是MongoDB的默认值,因此您无需明确表达它。看看没有它看起来有多好。