2015-03-05 4 views
6

Когда я использую Монго-рубиновый-драйвер и вставить новый документ, он возвращает сгенерированный «_id»:Мопед: получить идентификатор после вставки

db = MongoClient.new('127.0.0.1', '27017').db('ruby-mongo-examples') 
id = db['test'].insert({name: 'example'}) 

# BSON::ObjectId('54f88b01ab8bae12b2000001') 

Я пытаюсь получить «_id» документа после того, как делая вставку с использованием мопеда:

db = Moped::Session.new(['127.0.0.1:27017']) 
db.use('ruby-mongo-examples') 
id = db['coll'].insert({name: 'example'}) 

# {"connectionId"=>15, "n"=>0, "syncMillis"=>0, "writtenTo"=>nil, "err"=>nil, "ok"=>1.0} 

Как получить идентификатор, используя мопед?

Update:

Я также пытаюсь использовать безопасный режим, но он не работает:

db = Moped::Session.new(['127.0.0.1:27017']) 
db.use('ruby-mongo-examples') 

db.with(safe: true) do |safe| 
    id = safe['coll'].insert({name: 'example'}) 

    # {"connectionId"=>5, "n"=>0, "syncMillis"=>0, "writtenTo"=>nil, "err"=>nil, "ok"=>1.0} 
end 
+1

Вы можете получить его в ответе, если вы сделаете [безопасную вставку] (http://mongoid.org/en/moped/) или сгенерируете его перед вставкой, например 'document = {_id: Moped :: BSON :: ObjectId .new, name: "example"} id = document [: _ id] ' – chridam

+1

Я нашел эту проблему: https://github.com/mongoid/moped/issues/129. Кажется, что единственным способом является общий идентификатор с BSON :: ObjectId.new и его использование. Спасибо @chridam. – drinor

+0

Я думаю, что ответ @ hamster_ham более уместен, чем мой, ваш призыв принять его. – chridam

ответ

0

Из этого issue:

Было бы хорошо, но, к сожалению, Монго не дает нам ничего назад при вставке (так как это огонь и забыть), а когда в безопасном режиме это стиль l не возвращает идентификатор, если он сгенерировал его на сервере . Таким образом, для нас действительно нет никакого способа сделать это , если это не будет основной особенностью в MongoDB.

Лучше бы генерировать идентификатор перед вставкой документа:

document = { _id: Moped::BSON::ObjectId.new, name: "example" } 
id = document[:_id] 
+1

Ответ hamster_ham более согласован с тем, как вы ожидаете, что манго будет работать, то есть вставить документ, получить идентификатор обратно в результат. –

+1

@ChrisMcCauley Я согласен, вызов OP для переключения принятого ответа. – chridam

+0

Хорошо сказал chridam - уважение! –

13

После вставки/сбережения, возвращаемый объект будет иметь свойство inserted_id которое является BSON::ObjectId:

# I'm using insert_one 
result = safe['coll'].insert_one({name: 'example'}) 
result.methods.sort  # see list of methods/properties 
result.inserted_id 
result.inserted_id.to_s # convert to string 
+0

работал для меня без "safe ['coll']", просто coll.insert_one (...) – jacvalle

Смежные вопросы