1

node-mongodb-native のドキュメントで説明されているように、カウンター コレクションを実装する方法はありますか?

私は 9000 を超えるコールバックをネストすることでこれを回避しようとしています (これは私見ではだらしなくエレガントではないように聞こえます) が、このネイティブ ドライバーを作成した善良な人々は、同期/ブロッキング呼び出しの実装を拒否しました。

ネイティブ ドライバーは、ユーザー定義関数を呼び出し、クエリ中にその戻り値を使用する方法を提供していますか? または、シーケンシャル カウントを抽出する別の方法があるのObjectID()でしょうか。

何か案は?

編集:
これは_idフィールド用ではありません(これはによって処理されますdb.coll.save(x)
コレクションにさまざまな種類のドキュメントがあります。私が何を意味するかを知っていれば、これらにはそれぞれ独自の「タイプシリアル」または「タイプシーケンス」が必要です。

以下に示すように、いくつかのネストされた呼び出しを使用して、これ (およびその他のもの) を既に実装しています。クライアントからですdoc。これを ( でソート) と(現在以下のようにソート中)でクライアントJSON.parseに返す必要があります。doc_iddb.coll.savetypeserialdb.coll.count

 ///more nesting Async calls above. 
 db.collection('dox').count( { "type" : doc.type } ,
    function( err , count )
    {
        ///{some err checking code here}
        doc.typeseq = (1+count);
        db.collection('dox').save( doc ,
            function( err , doc )
            {
                ///{more code here}
                ///Finally return JSON.stringified doc with new info/members to client-side
            }
        );
    }
 );

よりエレガントで非同期の方法で取得する方法があるかどうかを知りたいだけですdoc.typeserial

4

2 に答える 2

1

私は基本的に答えとして私のコメントを平手打ちするつもりです:

必要なのは 2 つのコールバックだけです。1 つは定義済みのアトミックに取得された _id を取得するためのもので、もう 1 つは実際にドキュメントを挿入するためのものです。自動インクリメント _id を取得したら、このように挿入されたドキュメントに対して常に一意である必要があります

さらに説明すると、カウンター コレクションを使用findAndModifyしてから戻る場合、そのスクリプトの実行とその結果としてのドキュメントの挿入が一意である必要があります。基本的に、このメソッドには競合状態はありません。$inc_id

insertWithAIこれは、挿入の後者のコールバックをチェーンするために使用の最初のコールバックを実行するような、ある種の親関数が必要になることを意味しますが、1findAndModify日の終わりには 2 つのコールバックしか必要ありません。

于 2013-08-22T07:48:01.767 に答える
0

async while の助けを借りて、「楽観的ループ」で自動インクリメントを実装しましたが、これは正常に機能しました。

mongoDB で増分番号を作成する

于 2015-06-04T20:10:17.207 に答える