RMongo dbGetQueryForKeys(), какова структура "ключей" и как их подразделить?
Я пытаюсь запросить базу данных Mongo из R с помощью RMongo и вернуть значения пары вложенных документов.
Просматривая документацию по RMongo, я понимаю следующий запрос:
output <- dbGetQueryForKeys(mongo, 'test_data', '{"foo": "bar"}', '{"foo":1}')
Где аргументы...
db = mongo
collection = 'test_data'
query = '{"foo": "bar"}'
keys = 'Specify a set of keys to return.'
Что такое 1 в '{"foo":1}'
? Какова структура этого набора ключей? Проверяя это сообщение в блоге, я нашел такой формат:
результат <- dbGetQueryForKeys (mongo, "items", "{'publish_date': {'$ gte': '2011-04-01', '$ lt': '2011-05-01'}}", "{' publish_date ': 1,' rank ': 1} ")
Так что, видимо, для ключей нужно значение 1?
Как получить ключи для вложенных документов? Если бы я хотел что-то вроде...
output <- dbGetQueryForKeys(mongo, 'test_data', '{"foo": "bar"}', '{"foo1.foo2.foo3.foo4":1,"foo1.foo2.foo3.bar4":1}')
Для вложенных ключей я сейчас возвращаю что-то более похожее на...
X_id
1 50fabd42a29d6013864fb9d7
foo1
1 { "foo2" : { "foo3" : { "foo4" : "090909" , "bar4" : "1"}}}
...где output[,2]
является слишком длинной строкой, а не двумя отдельными переменными для значений, связанных с ключами foo4 и bar4, ("090909", "1"), как я и ожидал.
2 ответа
Что такое 1 в '{"foo":1}'? Какова структура этого набора ключей?
Эти ключи являются проекциями запроса, который нужно вернуть для операций чтения в MongoDB. Значение "1" означает включение определенного поля, а "0" исключает. Поведение по умолчанию включает все поля в проекции.
Как получить ключи для вложенных документов?
Для вложенных ключей я сейчас возвращаю что-то более похожее... 1 { "foo2": { "foo3": { "foo4": "090909", "bar4": "1"}}} ... где вывод [,2] - более длинная строка, а не две отдельные переменные для значений, связанных с ключами foo4 и bar4 ("090909", "1"), как я и ожидал.
Драйвер RMongo возвращает данные, включая hiearchy для встраивания.
Вы можете изменить форму и сгладить результат, используя RMongo dbAggregate()
командование и $project
оператор, который является частью Aggregation Framework в MongoDB 2.2+.
Если ваша конечная цель состоит в извлечении значений из вложенного объекта для некоторого типа последующей обработки в R, это приведет вас туда. Это избавляет от необходимости создавать конвейер агрегации и является простым решением вашей проблемы. Вместо того чтобы пытаться углубиться во вложенную структуру и получить прямой доступ к bar4, извлеките верхний уровень объекта, который предоставит длинную строку, на которую вы ссылаетесь.
output <- dbGetQueryForKeys(mongo, 'test_data', '{"foo": "bar"}', '{"foo1.foo2.foo3.foo4":1,"foo1":1}')
Поскольку выходные данные представляют собой data.frame, вы можете использовать библиотеку 'jsonlite', чтобы получить ваши данные:
library(jsonlite)
foo1 <- fromJSON(output$foo1)
bar4 <- foo1$foo2$foo3$bar4