2014-01-27 2 views
1

Я запускаю запрос mongodb в R, используя rmongodb. Мне нужно определить, существует или нет определенное поле в документе. Однако $ exists не дает никакого результата. Вот пример кода, используемый для запроса.

library(rmongodb) 
> mongo <- mongo.create(host="localhost") 
> dbns <- mongo.get.database.collections(mongo, db="namedisambiguation") 
> buf <- mongo.bson.buffer.create() 
> mongo.bson.buffer.start.object(buf, "name") 
[1] TRUE 
> mongo.bson.buffer.append(buf, "$exists", 1L) 
[1] TRUE 
> qrbson <- mongo.bson.from.buffer(buf) 
> cur <- mongo.find(mongo, ns=dbns, query=qrbson) 
> qrbson 
    name : 3  
     $exists : 16  1 

> mongo.cursor.next(cur) 
[1] FALSE 

Я попробовал этот запрос с использованием TRUE, «True», «правда», 1 вместо 1 л, но все это производит тот же самый результат. Я проверил этот запрос в консоли mongo, и результат по мере необходимости. Но в R его порождение пусто. Я что-то неправильно делаю?

+1

Утренний юмор в понедельник: хорошо знать, что больше нет «$ существует». Гендерное равенство наконец! :-) –

ответ

0

Я могу воспроизвести вашу проблему, и я предполагаю, что это ошибка.

Но то, что вы могли бы сделать что-то вдоль этих линий здесь - код проверяется с моей базой данных:

ns <- "test.things" 
qs1 <- '{ "label": { "$exists": true } }' # field exists 
qs2 <- '{ "none": { "$exists": true } }' # field does not exist 

mongo.count(mongo, ns, qs1) 
[1] 9 

mongo.count(mongo, ns, qs2) 
[1] 0 

Если вам необходимо проверить, существует ли два поля в одном документе, ваш JSON должен выглядеть следующим образом:

qs3 <- '{ "name": { "$exists": true }, "schoolname": { "$exists": true } }' 

Это должно заставить вас к желаемому результату, хотя это немного отличается от оригинального подхода, который использует JSON обозначения. Из rmongodb документации mongo.find()

Аргументов ...

запроса ...

В качестве альтернативы, запрос может быть корректной строка символов JSON, который будет преобразован к mongo.bson object by mongo.bson.from.JSON().

+0

спасибо за ответ, он работал для одного запроса и именно в том, что мой вопрос требует. Однако моя фактическая проблема заключалась в «и» qs1 и qs2, например, {$ и: [{name: {$ exists: 1}}, {schoolname: {$ exists: 1}}]}. Я просто пытался сделать, как вы seggested, но все еще не работает и производит -1 в качестве результата –

+0

см. Отредактированный ответ – vaettchen

+0

спасибо! который работал –

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