2016-12-21 5 views
0

Предположим, мы заинтересованы в написании дополнительного медленного движка HFT и используем Mongo.Запросить поддокументы поддокумента/списка в Mongo

Вот JSON, представляющий собой кучу ежедневных объектов форекс:

{ 
    date: 2016-12-21, 
    relation: { 
     {currency: USD, value: 1.0}, 
     {currency: EUR, value: 0.9}, 
    } 
}, 
{ 
    date: 2016-12-21, 
    relation: { 
     {currency: USD, value: 0.9}, 
     {currency: FJD, value: 1.0}, 
    } 
}, 

Я хочу, чтобы извлечь все ежедневные объекты форекс, где:

  • дата = 2016-12-21
  • в Форекс-объект описывает валюту FJD по крайней мере в одной позиции своего списка отношений

Как?

ответ

1

Попробуйте следующее:

db.collection.find({ 
    "$or" : [ 
    { 
     "date" : "2016-12-21", 
     "relation.0.currency" : "JSD" 
    }, 
    { 
     "date" : "2016-12-21", 
     "relation.1.currency" : "JSD" 
    } 
    ] 
}) 

Обратите внимание, что пример документ не является действительным JSON, поэтому запрос выше соответствует всем значениям в виде строк. Я также предположил, что «отношение» представляет собой встроенный документ, а не массив; с «0» и «1» - именами строковых полей, а не позициями массива.

Если ваши «отношения» были структурированы как массив вложенных документов, как следующее:

{ 
    date: "2016-12-21", 
    relation: [ 
     { currency: "USD", value: 1.0}, 
     { currency: "EUR", value: 0.9}, 
    ] 
} 

то запрос будет:

db.collection.find({ 
    "date" : "2016-12-21", 
    "relation.currency" : "JSD" 
}) 

См Array of Embedded Documents для получения дополнительной информации.

+0

Спасибо за это. Проблема, с которой я сталкиваюсь, - это pymongo. Он выводит список словарей python в примере, приведенном в моем вопросе (отредактирован для ясности только сейчас). При использовании с robomongo списки были представлены с [0] [1], что не было правдой. Я думаю, ваш второй пример будет работать. – mh00h

Смежные вопросы