2015-03-05 11 views
6

Khi tôi sử dụng Mongo-ruby-lái xe và tôi chèn tài liệu mới nó trả về tạo '_id':Moped: get id sau khi chèn

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

# BSON::ObjectId('54f88b01ab8bae12b2000001') 

Tôi đang cố gắng để có được những '_id' của một tài liệu sau thực hiện chèn bằng cách sử dụng Xe máy:

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} 

Làm cách nào để có id sử dụng Xe máy?

Cập nhật:

tôi cũng cố gắng sử dụng chế độ an toàn nhưng nó không hoạt động:

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

Bạn có thể nhận được phản hồi nếu bạn thực hiện [chèn an toàn] (http://mongoid.org/en/moped/) hoặc tạo nó trước khi chèn như 'document = {_id: Moped :: BSON :: ObjectId .new, name: "example"} id = document [: _ id] ' – chridam

+1

Tôi đã tìm thấy sự cố này: https://github.com/mongoid/moped/issues/129. Có vẻ như cách duy nhất là id generte với BSON :: ObjectId.new và sử dụng nó. Cảm ơn @chridam. – drinor

+0

Tôi nghĩ câu trả lời của @ hamster_ham phù hợp hơn tôi, gọi điện của bạn để chấp nhận nó. – chridam

Trả lời

0

Từ này issue:

Nó sẽ được tốt đẹp, nhưng tiếc là Mongo không cung cấp cho chúng tôi bất cứ điều gì trở lại khi chèn (vì nó cháy và quên) và khi ở chế độ an toàn , nó sẽ bị bẩn Tôi không trả lại id nếu nó được tạo trên máy chủ . Vì vậy, có thực sự không phải là bất kỳ cách nào có thể cho chúng tôi để làm điều này trừ khi nó là một tính năng cốt lõi trong MongoDB.

Đặt cược của bạn tốt nhất là để tạo ra id trước khi chèn tài liệu:

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

Câu trả lời của hamster_ham phù hợp hơn với cách bạn mong đợi mongo hoạt động tức là chèn tài liệu vào lại id. –

+1

@ChrisMcCauley Tôi đồng ý, OP gọi điện để chuyển câu trả lời được chấp nhận. – chridam

+0

Cũng nói chridam - tôn trọng! –

13

Sau khi chèn/tiết kiệm, đối tượng quay trở lại sẽ có một tài sản inserted_id mà là một 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

làm việc cho tôi mà không có "safe ['coll']", chỉ coll.insert_one (...) – jacvalle

Các vấn đề liên quan