轻便摩托车:插入后获取id

dri*_*nor 6 mongodb mongoid moped

当我使用mongo-ruby-driver并插入新文档时,它返回生成的'_id':

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

# BSON::ObjectId('54f88b01ab8bae12b2000001')
Run Code Online (Sandbox Code Playgroud)

在使用Moped进行插入后,我试图获取文档的"_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}
Run Code Online (Sandbox Code Playgroud)

我如何使用轻便摩托车获得身份证?

更新:

我也尝试使用安全模式,但它不起作用:

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
Run Code Online (Sandbox Code Playgroud)

ham*_*ham 15

插入/保存后,返回的对象将有一个属性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
Run Code Online (Sandbox Code Playgroud)


chr*_*dam 0

从这个问题

那就太好了,但不幸的是,Mongo 在插入时不会给我们任何返回值(因为它是即发即忘),并且在安全模式下,如果它在服务器上生成了 id,它仍然不会返回 id。所以我们确实没有任何可能的方法来做到这一点,除非它是 MongoDB 的核心功能。

最好的办法是在插入文档之前生成 id:

document = { _id: Moped::BSON::ObjectId.new, name: "example" } 
id = document[:_id]
Run Code Online (Sandbox Code Playgroud)

  • hamster_ham 的答案更符合您期望 mongo 的工作方式,即插入文档获取 id 返回结果。 (2认同)