0

私が扱っている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]}}')

同じ結果です。ただし、これを 1 つのアイテムだけを取得しようとすると、次のようになります。

  cursor <- mongo.find(mongo, ns,
                   query = list(UID = 1))

できます。

何がうまくいかないのですか?

アップデート:

以下が実際に機能することがわかりました。

cursor <- mongo.find(mongo, ns,
                     query = list(UID = list('$in' = c(1,2,5))))

ただし、ベクトルに複数の要素がある場合のみ。テスト目的で 1 要素ベクトルを使用していましたが ( 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
4

1 に答える 1

2

簡単な答え- R の名前のないリストは MongoDB 配列に変換されます。したがって、クエリが のように見える場合{id : {$in : [17]}}、R の bson コンストラクターは次のようになります。mongo.bson.from.list(list(id = list("$in" = list(17))))

長い回答
1. まず、 を使用してください。内部で使用するmongo.bson.from.listよりもはるかに効率的で簡単です。R 型を MongoDB 型に直接変換します。 2. R でこの式を評価してみてください。mongo.bson.from.JSONmongo.bson.from.list

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"
于 2015-02-09T16:47:15.590 に答える