rmongodb:$in-query 不起作用
rmongodb: $in-query doesn't work
我正在使用的 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
再试一次:
cursor <- mongo.find(mongo, ns,
query = '{"UID":{"$in":[1,2,5]}}')
同样的结果。但是,如果我尝试只获取一项:
cursor <- mongo.find(mongo, ns,
query = list(UID = 1))
有效。
知道出了什么问题吗?
更新:
我发现以下确实有效:
cursor <- mongo.find(mongo, ns,
query = list(UID = list('$in' = c(1,2,5))))
但前提是向量有多个元素。我使用单元素向量进行测试 (c(1)
),但失败了。我不确定这是错误还是出于某种原因这是预期的行为。
JSON-查询仍然无效。
更新:
这是 sessionInfo()
的结果:
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
简答 - 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的list
类型来显式指向。
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 数据库集合的项目有一个字段 "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
再试一次:
cursor <- mongo.find(mongo, ns,
query = '{"UID":{"$in":[1,2,5]}}')
同样的结果。但是,如果我尝试只获取一项:
cursor <- mongo.find(mongo, ns,
query = list(UID = 1))
有效。
知道出了什么问题吗?
更新:
我发现以下确实有效:
cursor <- mongo.find(mongo, ns,
query = list(UID = list('$in' = c(1,2,5))))
但前提是向量有多个元素。我使用单元素向量进行测试 (c(1)
),但失败了。我不确定这是错误还是出于某种原因这是预期的行为。
JSON-查询仍然无效。
更新:
这是 sessionInfo()
的结果:
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
简答 - 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的list
类型来显式指向。
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"