查找查找以查找检索mongodb中特定元素的数据

时间:2017-06-15 21:15:01

标签: javascript mongodb pymongo

我的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 \"}"
}

1 个答案:

答案 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的默认值,因此您无需明确表达它。看看没有它看起来有多好。