Как построить запрос rmongodb, используя $ и оператор
Я хочу использовать rmongodb для доступа к базе данных MongoDB в R. Я попытался построить следующий запрос:
{'$and': [{_id: {'$gte': '2013-01-01'}}, {_id: {'$lte': '2013-01-10'}}]}
Я попробовал три разных метода для создания объекта bson, но мне не повезло.
Способ 1:
buf = mongo.bson.buffer.create()
mongo.bson.buffer.start.array(buf, '$and')
mongo.bson.buffer.append(buf, '_id', list('$gte'='2013-01-01'))
mongo.bson.buffer.append(buf, '_id', list('$lte'='2013-01-10'))
mongo.bson.buffer.finish.object(buf)
bson = mongo.bson.from.buffer(buf)
Способ 2:
buf = mongo.bson.buffer.create()
mongo.bson.buffer.start.array(buf, '$and')
mongo.bson.buffer.start.object(buf, '_id')
mongo.bson.buffer.append(buf, '$gte', '2013-01-01')
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, '_id')
mongo.bson.buffer.append(buf, '$lte', '2013-01-10')
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
bson = mongo.bson.from.buffer(buf)
Способ 3:
mongo.bson.from.list(list('$and'=list('_id' = list('$lte'='2013-01-10'), '_id' = list('$gte'='2013-01-01'))))
Ни один из них не работает. Все возвращают пустой результат.
Когда-то я искал, единственный похожий вопрос - это rmongodb: использование $ или запрос. Вместо этого было решено использовать RMongo, что недоступно для R 2.50.
Я застрял в этой проблеме на несколько дней. если я не могу найти решение, мне нужно написать внешний скрипт с python и вызвать его из R.
2 ответа
Я не знаю R, но на самом деле вам не нужно использовать $and
для этого запроса. Это немного проще и должно быть легче перевести на R:
{_id: {'$gte': '2013-01-01', '$lte': '2013-01-10'}}
Ваш способ создания массива Монго Бсон неверен. Вам не хватает частей
mongo.bson.buffer.start.object(buf, "0")
...
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, "1")
...
mongo.bson.buffer.finish.object(buf)
Для рабочего примера, пожалуйста, проверьте последний комментарий: https://github.com/mongosoup/rmongodb/issues/17
Я надеюсь, что это работает на данный момент. Я работаю над более простым решением!