2015-02-17 3 views
1

Я пытаюсь написать общий upsert для базы данных клеща в R.

код питона будет:

collection.update({'symbol':'somesymbol', 'sha':'SoM3__W3|Re|[email protected]'}, 

        {'$set':{segment:5}, 

        '$addToSet': {'parent':parent_id}}}, 

        upsert=True) 

в РИ я использую rmongodb и пытается построить BSON объекты

#get the query 

mtch_b<-mongo.bson.buffer.create() 

mongo.bson.buffer.append(mtch_b, "symbol", "somesymbol") 

mongo.bson.buffer.append(mtch_b, "sha", "SoM3__W3|Re|[email protected]") 

mtch<-mongo.bson.from.buffer(mtch_b) 



#set the segment 

qry_b<-mongo.bson.buffer.create() 

mongo.bson.buffer.start.object(qry_b, "$set") 

    mongo.bson.buffer.append(qry_b, "segment", 5) 

      mongo.bson.buffer.start.object(qry_b, "$addToSet") 

       mongo.bson.buffer.append(qry_b, "parent", "Initial") 

      mongo.bson.buffer.finish.object(qry_b) #end of $addtoSet object 

mongo.bson.buffer.finish.object(qry_b) #end of $set object 

qry_bsn <-mongo.bson.from.buffer(qry_b) 



mongo.update(mongo, "M__test.tmp", mtch, qry_bsn, flags=mongo.update.upsert) 

Когда я запускаю это я получаю сообщение об ошибке:

"The dollar ($) prefixed field '$addToSet' in '$addToSet' is not valid for storage." 

глядя на qry_bsn:

qry_bsn 

    $set : 3   

      segment : 4  

        0 : 1 1.000000 

        1 : 1 2.000000 

        2 : 1 3.000000 

        3 : 1 4.000000 



      $addToSet : 3 

        parent : 2  Initial 

Когда я извлекаю $ addToSet, добавить в конец и закончить объекты $ addToSet объекта запроса работает нормально.

Любая помощь в том, как это сделать, будет очень признательна.

+0

Если вы видите запрос, '$ addToSet' отображается на уровне сегмента, что неверно. Он должен отображаться на уровне '$ set'. Это означает, что создание 'bson buffer' неправильное. – BatScream

ответ

1

Я не могу найти причину не использовать mongo.bson.from.list. Он делает все звонки mongo.bson.buffer.*. И гораздо меньше шансов создать ошибку с построением bson.

query <- mongo.bson.from.list(list("symbol" = "somesymbol", "sha" = "SoM3__W3|Re|[email protected]")) 
upd_obj <- mongo.bson.from.list(list('$set' = list('segment' = 1:4), '$addToSet' = list('parent' = 'PARENT_ID'))) 
mongo.update(mongo = mongo, ns = "M__test.tmp", criteria = query, objNew = upd_obj, flags=mongo.update.upsert)