具有多个条件的pymongo db查询 - $和$ exists

时间:2018-05-23 14:45:37

标签: mongodb pymongo

示例文档如下所示

 {
    "_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个文档,我想为{em>时间范围中type: "f"的所有文档获取光标但是那确实存在。数据库中有一些文件打破了我以前的代码(没有检查PRICES SPOT是否存在)。

我看到我可以使用documentation中的$and$exists。但是,由于范围和嵌套,我无法进行设置。我使用 pyMongo 作为我的python驱动程序,并注意到here我必须将$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

1 个答案:

答案 0 :(得分:1)

您尝试使用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',有额外的奖励,不仅你知道它#34;存在",而且它至少有一个要在其中处理的项目

Python和JavaScript在对象/字典构造方面几乎相同,所以你真的应该只能遵循一般文档和这里主要是JavaScript的许多示例。

我个人甚至尝试用有效的JSON在这里注明答案,因此可以选择并解析"由任何语言的用户。但是在这里,python与你可以输入mongo shell的内容完全相同。当然,True除外。

有关语法的概述,请参阅"Dot Notation",并在Query on Embedded / Nested Documents

了解更多信息