pymongo db query с несколькими условиями - $ и $ существует - PullRequest
0 голосов
/ 23 мая 2018

Пример документа выглядит следующим образом

 {
    "_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

1 Ответ

0 голосов
/ 24 мая 2018

Вы пытаетесь использовать синтаксис 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, и часть вашего оператора фактически так и делала, так что сделайте это согласованным.

Также проверка на "не-impty "массив равен 'data.PRICES SPOT.0' с дополнительным бонусом, который не только знает, что он" существует ", но и что в нем есть хотя бы один элемент для обработки

Python и JavaScript практически идентичны в терминахконструкции объекта / dict, так что вы действительно должны иметь возможность просто следовать общей документации и многим примерам, которые в основном представляют собой JavaScript.

Лично я даже пытаюсь записать здесь ответы с допустимым JSON, так что это может бытьподобраны и «проанализированы» пользователями любого языка.Но здесь python просто идентичен тому, что вы можете ввести в оболочку mongo.За исключением True, конечно.

См. "Точечная нотация" для обзора синтаксиса с дополнительной информацией в Запрос на встраиваемые / вложенные документы

...