示例文档如下所示
{
"_id":ObjectId("562e7c594c12942f08fe4192"),
"Type": "f",
"runTime": ISODate("2016-12-21T13:34:00.000+0000"),
"data" : {
"PRICES SPOT" : [
{
"value" : 29.64,
"timeStamp" : ISODate("2016-12-21T23:00:00.000+0000")
},
{
"value" : 29.24,
"timeStamp" : ISODate("2016-12-22T00:00:00.000+0000")
},
{
"value" : 29.81,
"timeStamp" : ISODate("2016-12-22T01:00:00.000+0000")
},
{
"value" : 30.2,
"timeStamp" : ISODate("2016-12-22T02:00:00.000+0000")
},
{
"value" : 29.55,
"timeStamp" : ISODate("2016-12-22T03:00:00.000+0000")
}
]
}
}
我的MongoDb有不同的文档Type
,我想为来自某个时间范围的所有文档获取光标,这些文档type: "f"
但实际存在。数据库中有一些文档破坏了我以前的代码(没有检查PRICES SPOT
是否存在(。
我看到我可以使用文档中的$and
和$exists
。但是,由于范围和嵌套,我在设置它时遇到了问题。我正在使用pyMongo作为我的python驱动程序,并且还注意到我必须将$and
和$exists
括在引号中。
我的代码
def grab_forecast_cursor(self, model_dt_from, model_dt_till):
# create cursor with all items that actually exist
cursor = self._collection.find(
{
"$and":[
{'Type': 'f', 'runTime': {"$gte": model_dt_from, "$lte": model_dt_till}
['data']['PRICES SPOT': "$exists": true]}
]})
return cursor
这会导致Key Error
找不到data
。没有PRICE SPOT
的示例文档看起来与我一开始发布的文档完全相同,只是没有分别。
简而言之..有人可以帮我设置一个查询,我可以在其中抓取包含某种类型但实际上嵌套内容的所有文档的光标。
更新
我在model_dt_till
后添加了一个逗号,现在有一个语法错误。
def grab_forecast_cursor(self, model_dt_from, model_dt_till):
# create cursor with all items that actually exist
cursor = self._collection.find(
{
"$and":[
{'Type': 'f', 'runTime': {"$gte": model_dt_from, "$lte": model_dt_till},
['data']['PRICES SPOT': "$exists": true]}
]})
return cursor
您正在尝试使用 Python 语法来表示数据结构的路径,但"数据库"想要的是使用"点表示法"的"键"语法:
cursor = self._collection.find({
"Type": "f",
"runTime": { "$gte": model_dt_from, "$lte": model_dt_till },
"data.PRICES SPOT.0": { "$exists": True }
})
你也不需要写这样的$and
,因为所有的MongoDB查询条件都已经是AND表达式,而且你的部分语句实际上已经这样做了,所以要保持一致。
此外,检查"非空"数组还'data.PRICES SPOT.0'
额外的好处,即您不仅知道它"存在",而且它至少有一个项目要处理
Python 和 JavaScript在对象/字典构造方面几乎相同,所以你真的应该能够遵循一般文档和这里的许多示例,主要是 JavaScript。
我个人甚至尝试在这里用有效的 JSON 标注答案,这样任何语言的用户都可以拾取和"解析"。但在这里,python 与你可以输入mongo
shell 的内容相同。当然,True
除外。
有关语法的概述,请参阅"点表示法",有关详细信息,请参阅查询嵌入/嵌套文档