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
Другие вопросы по тегам