2014-01-27 74 views
1

我使用rmongodb在R中運行mongodb查詢。我需要找出文檔中是否存在某個字段。但是,$存在並不會產生任何結果。以下是用於查詢的示例代碼。

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 

我試過這個查詢使用真,「真」,「真」,1而不是1L,但所有這些產生相同的結果。我在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.from.JSON()生成mongo.bson對象。

+0

感謝您的答案,它適用於單個查詢和它的確切需求。然而,我的實際問題是「和」qs1和qs2像{$和:[{name:{$ exists:1}},{schoolname:{$ exists:1}}]}。我只是嘗試像你一樣做seggested,但仍然不工作,併產生-1作爲結果 –

+0

看到編輯答案 – vaettchen

+0

謝謝!工作 –