rmongodb:$in查询不';行不通

rmongodb:$in查询不';行不通,r,mongodb,rmongodb,R,Mongodb,Rmongodb,我正在使用的Mongo数据库集合中的项有一个字段“UID”。我想查找UID等于1、2或5的所有项目 以下是MongoVUE查询: {"UID":{"$in":[1, 2, 5]}} 这很有效 以下是rmongodb中的查询: cursor <- mongo.find(mongo, ns, query = list(UID = list('$in' = c(1,2,5)))) dummy <- mongo.cursor.next(cursor

我正在使用的Mongo数据库集合中的项有一个字段“UID”。我想查找UID等于1、2或5的所有项目

以下是MongoVUE查询:

{"UID":{"$in":[1, 2, 5]}}
这很有效

以下是rmongodb中的查询:

cursor <- mongo.find(mongo, ns,
                     query = list(UID = list('$in' = c(1,2,5))))
dummy <- mongo.cursor.next(cursor)
db.value <- mongo.cursor.value(cursor)
db.value
# NULL

简短回答-R的未命名列表被转换为MongoDB数组。因此,如果您的查询看起来像
{id:{$in:[17]}
,那么R的bson构造函数应该是
mongo.bson.from.list(list(id=list($in=list(17)))

长答案
1.首先,请使用
mongo.bson.from.list
,它比内部使用它的
mongo.bson.from.JSON
更高效、更严格
mongo.bson.from.list
直接将R类型转换为MongoDB类型。
2.尝试在R中计算此表达式:

c(1) == 1
class(1)
class(c(1))
标量和向量之间没有区别,所以我们无法预测你在写
c(1)
1
时的意思。但是当我们评估
c(1,2)
时,我们当然理解,用户使用的数组和R的数组将转换为MongoDB的数组。因此,我们使用R的
列表
类型来明确指出何时需要数组。
3.注意隐式类型强制:

print(mongo.bson.from.JSON('{"UID" : {"$in" : [1, 2, 5]}}'))
print(mongo.bson.from.JSON('{"UID" : {"$in" : [1.0, 2.0, 5.0]}}'))
print(mongo.bson.from.list(list("UID" = list('$in' = c(1,2,5))))
class(c(1,2,3))
# [1] "numeric"
class(c(1L,2L,3L))
# [1] "integer"

谢谢你的回答!我尝试了
mongo.find(mongo,ns,query=list(“UID”=list(“$in”=list(1,2,5)))
,但这不起作用(指针是
nil
)。但是,它仍然适用于
c(1,2,5)
。根据你所说的,我本以为
print(mongo.bson.From.list)(list(“UID”=list('$in'=list(1,2,5)'))
会产生与
print(mongo.bson.From.list)(list(“UID”=list('$in'=c(1,2,5)'))
相同的结果,但实际上bson看起来有点不同:
$in
的类型是3(bsonOBJECT)使用
list(1,2,5)
和使用
c(1,2,5)
的4(bsonARRAY)。您使用什么版本的rmongodb?您能否提供
sessionInfo()
信息?这看起来很奇怪,因为我的电脑上都有类型4。我已经将
sessionInfo()
的输出添加到原始帖子中。你说得对,我没有使用最新版本。如果您认为这是原因,我会更新并重试。请将软件包更新为最新版本。这正是这类问题的原因。它有许多改进和错误修复。从1.8.0开始,在大多数情况下,rmongodb按照用户的期望工作。
cursor <- mongo.find(mongo, ns,
                     query = list(UID = list('$in' = c(1,2,5))))
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252          LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] mixtools_1.0.1    segmented_0.3-1.0 MASS_7.3-32       boot_1.3-11       plyr_1.8.1        reshape2_1.4      data.table_1.9.4 
 [8] stringr_0.6.2     ggplot2_0.9.3.1   XML_3.98-1.1      rmongodb_1.6.5   

loaded via a namespace (and not attached):
 [1] chron_2.3-45     colorspace_1.2-4 digest_0.6.4     grid_3.0.3       gtable_0.1.2     jsonlite_0.9.7   munsell_0.4.2   
 [8] proto_0.3-10     Rcpp_0.11.1      scales_0.2.4     tools_3.0.3
c(1) == 1
class(1)
class(c(1))
print(mongo.bson.from.JSON('{"UID" : {"$in" : [1, 2, 5]}}'))
print(mongo.bson.from.JSON('{"UID" : {"$in" : [1.0, 2.0, 5.0]}}'))
print(mongo.bson.from.list(list("UID" = list('$in' = c(1,2,5))))
class(c(1,2,3))
# [1] "numeric"
class(c(1L,2L,3L))
# [1] "integer"