2012-05-09 8 views
25

私はmongooseを使ってmongodbを操作しています。今、テストのために、ネイティブ接続でmongodbにいくつかのデータを挿入したいと思います。mongooseを使ってmongodbに文書を挿入し、生成されたIDを取得する方法は?

しかし、問題は、挿入後に生成されたIDを取得する方法ですか?

私が試した:

var mongoose = require('mongoose'); 

mongoose.connect('mongo://localhost/shuzu_test'); 

var conn = mongoose.connection; 

var user = { 
    a: 'abc' 
}; 

conn.collection('aaa').insert(user); 

console.log('User:'); 
console.log(user); 

をしかし、それは印刷します。

{ a: 'abc' } 

_idフィールドがありません。

答えて

36

あなた自身_idを生成してデータベースに送信することができます。

var ObjectID = require('mongodb').ObjectID; 

var user = { 
    a: 'abc', 
    _id: new ObjectID() 
}; 

conn.collection('aaa').insert(user); 

これはMongoDBの私のお気に入りの機能の1つです。お互いにリンクされた多数のオブジェクトを作成する必要がある場合は、appとdbの間で多数のラウンドトリップを行う必要はありません。あなたはアプリですべてのIDを生成してから、すべてを挿入することができます。

+0

は、オブジェクトID()は、「利用可能」IDを取得するために往復を行うために、新たな必要はありません...それ以外の場合は、?衝突の可能性は非常に低いでしょうか? (例えば、MSSQLではNEWID()はRFC4122に準拠しています...衝突を防ぎますが、DB側で発生します)) –

+0

さらに調査を行い、このSOQuestion [https://私の答えは本質的に "いいえ、あなたは正しい"という理由で、oidがどのように生成され、衝突のシナリオが3つあるのかを説明しています(stackoverflow.com/a/5694803/1327508)。 oidがどのように生成されるか。 –

7

.saveを使用すると、コールバック関数で_idが返されます。

var user = new User({ 
    a: 'abc' 
}); 

user.save(function (err, results) { 
    console.log(results._id); 
}); 
0

あなたはアップサートでUpdateメソッドを使用することができます:trueオプション

aaa.update({ 
    a : 'abc' 
}, { 
    a : 'abc' 
}, { 
    upsert: true 
}); 
関連する問題