2016-05-17 4 views
3

素晴らしいmongoliteライブラリとの正規表現マッチをしようとしていますが、私は何が間違っているのかまだ分かりません。mongoliteと正規表現R

library(mongolite) 
m <- mongo(url = "mongodb://192.168.1.5:27017", db = "products", collection = "sku") 

m$count() 
#gives 54524 

a1 <- m$find('{"item" : { "$regex" : "/.*A*./i" }}') 
returns Imported 0 records. Simplifying into dataframe... 

#but when you do 
a1 <- m$find('{"item" : "ABC"}') 
#returns 8 records 
a1 <- m$find('{"item" : "AAC"}') 
#returns 5 records 
a1 <- m$find('{"item" : "AAAC"}') 
#returns 18 records 

などです。だから私はmongodbの正規表現演算子を呼び出す方法で何が間違っているのか分かりません。すべての手がかり。ありがとう

+0

正規表現クエリはmongoシェルで機能しますか? – SymbolixAU

+1

try 'a1 < - m $ find( '{" item ":" $ regex ":*。*、" $ options ":" i "}}') – SymbolixAU

答えて

5

mongoシェルでは、引用符なしで/ ... /を使用します。しかし、mongolite以内にあなたが引用符を必要とするそれ以外の場合は、あなたはそのためのmongoシェルで(私はrobomongoを使用)のに対し、この例

library(mongolite) 

m <- mongo(db = "test", collection = "test", url = "mongodb://localhost") 

## create and insert some dummy data 
set.seed(2016) 
df <- data.frame(id = seq(1:100), 
       val = sample(letters, size = 100, replace = T)) 

m$insert(df) 

## valid regex query in mongolite 
m$find('{ "val" : { "$regex" : "^a", "$options" : "i" } }') 
# Imported 5 records. Simplifying into dataframe... 
#  id val 
# 1 26 a 
# 2 53 a 
# 3 61 a 
# 4 76 a 
# 5 100 a 

## these queries don't work. 
m$find('{ "val" : { "$regex" : "/^a/", "$options" : "i" } }') 
# Imported 0 records. Simplifying into dataframe... 
# data frame with 0 columns and 0 row 

m$find('{ "val" : { "$regex" : /^a/, "$options" : "i" } }') 
# Error: Invalid JSON object: { "val" : { "$regex" : /^a/, "$options" : "i" } } 

考えてみましょう... { "$regex" : ".*A*.", "$options" : "i"}...

を使用する必要が無効なJSON

だあなたcanいずれかを使用

db.test.find({ "val" : { "$regex" : /^a/ } }) 
## or 
db.test.find({ "val" : { "$regex" : "^a" } }) 
あなたはもう少しスピードが Rにあなたのデータを取得し、あなたの結果は、データの損失なし data.tableに強制することができます後にしている場合

さて、あなたはdata.table::rbindlistを使用していますmongoliteを拡張し、私が書いたパッケージを使用することができます結果をdata.tableに変換します。あなたのデータが「表形式」の構造であると仮定し、JSONをdata.frameに単純化するmongoliteの再帰呼び出しを避けるため、速度は向上します。詳細はmy github pageを参照してください。

# library(devtools) 
# install_github("SymbolixAU/mongolitedt") 
library(mongolitedt) 
bind_mongolitedt(m) 

m$finddt('{ "val" : { "$regex" : "^A", "$options" : "i" } }') 
## returns a data.table 
# Imported 5 records. 
#  id val 
# 1: 26 a 
# 2: 53 a 
# 3: 61 a 
# 4: 76 a 
# 5: 100 a 
+0

すべての詳細をありがとう。 'mongolitedt'ライブラリのポインタもありがとう、面白いです。 –

+0

@KateK - 問題ありません。 'mongolitedt'はCRANにはなく、まだ開発中ですが、一般的な使用には十分安定している必要があります。 – SymbolixAU