18

_idnode.jsのMongoDBラッパーとしてmongooseを使用して、最後に挿入されたものを取得したいと思います。次のチュートリアルを見つけましたが、アプリがパブリックサーバーで実行されているため、ノードモジュールを変更できません。

「最後に挿入されたID」を取得する(ヒント-マングースをハックする必要があります)

他のアイデアはありますか?これが私がやりたいことです:

  • 新しいユーザーを挿入します
  • ユーザーの_id価値を得る
  • ユーザーのIDに基づいて新しいセッションを設定します
  • /にリダイレクト

ありがとう!

4

6 に答える 6

41

私は mongoose バージョン 1.2.0 を使用していますが、mongoose モデルの新しいインスタンスを作成するとすぐに、_id既に設定されています。

coffee> u = new User()
[object Object]
coffee> u._id
4dd68fc449aaedd177000001

u.save()また、呼び出した後も_id同じままであることを確認しました。これが実際に MongoDB に保存されている実際の ID であることを MongoHub で確認しました。

于 2011-05-20T16:05:15.860 に答える
5

明示的に宣言した場合

    _id: Schema.ObjectId

モデルの場合、新規または保存後にObjectIdは使用できなくなります。これはおそらくバグです。

于 2012-05-31T13:53:02.027 に答える
3

サブオブジェクトの最後に挿入された _id を取得したい場合は、オブジェクトを作成してアイテムに追加します。これは、MongoDB と Mongoose を使用して (スキーマ シュガーを追加するために) NowJS での例で、結果を JSON に変換してクライアントに送り返します。

                var nowRoomID = this.now.room;
                var Conversation = mongoose.model('Conversation');
                Conversation.findById(convID, function(error, conversation) {
                    var Blip = mongoose.model('Blip');
                    var createdBlip = new Blip();
                    createdBlip.author= nowUserName;
                    createdBlip.authorid = parsed.authorid;
                    createdBlip.body = revisedText;
                    createdBlip.created_at = new Date();
                    createdBlip.modified_at = new Date();

                    conversation.blips.push(createdBlip);
                    parsed._id = createdBlip._id;  //NOTE: ID ACCESSED HERE
                    message = JSON.stringify(parsed);

                    conversation.save(function (err) {
                        if (!err) {
                            console.log('Success - saved a blip onto a conversation!');
                            nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message);
                        }

                    });
于 2011-09-29T15:08:52.750 に答える
0

save は保存されたドキュメントを返すため、コールバックに渡されたドキュメントから ID を取得するだけです。

于 2012-04-01T23:58:12.733 に答える
0

MongoDB では、ドキュメントの値を明示的に設定しない場合_id、クライアント ドライバーが自動的にObjectId値に設定します。これは、SQL Server のscope_identity()や MySQL のlast_insert_id()のように、サーバー上で ID を生成し、それを取得するために別のクエリが必要なデータベースとは異なります。

これにより、続行する前にサーバーが値を返すのを待つ必要がないため、非同期でデータを挿入できます_id

そのため、Peter の回答に示されているよう_idに、ドキュメントがデータベースに保存される前に利用できます。

于 2011-05-21T00:11:19.347 に答える
-2

以下のURLをチェック

http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

指定されたURLに次のコードがあります

    var document = {name:"David", title:"About MongoDB"};
   collection.insert(document, {w: 1}, function(err, records){
  console.log("Record added as "+records[0]._id);
});
于 2014-10-08T13:42:06.620 に答える