0

キャップされたコレクションが空の場合は空のドキュメントをアトミックに挿入しようとしています。空でない場合は、最後に自然に並べ替えられたドキュメントを返します。findAndModify でこれを行うことはできますか?

db.collection.findAndModify({
    query: { _id: { $exists: true }},
    sort: { $natural: -1 },
    update: {},
    upsert: true,
    new: true
});

これは、最新のドキュメントを返す (コレクションが空でない場合) か、存在しない場合は新しいドキュメントを挿入することを期待していましたが、呼び出されるたびに空白のドキュメント (_id なし) を挿入します。findAndModify は上限のあるコレクションで機能しますか? 追加されたドキュメントに_id.

ありがとう。

-スコット

4

1 に答える 1

1

キャップされたコレクションが空の場合は空のドキュメントをアトミックに挿入しようとしています。空でない場合は最後に自然に並べ替えられたドキュメントを返します。findAndModifyでこれを行うことはできますか?

クエリロジックに欠陥があります。findAndModify()と:

query: { _id: { $exists: true }},
sort: { $natural: -1 },
update: {},
upsert: true,
new: true

... 意思:

  • _idセットを使用して最後に挿入されたレコードを更新します

    また

  • が付いた既存のドキュメント_idが見つからない場合は、新しい(空の)ドキュメントを挿入します。

更新により、最後に挿入されたレコードが空のレコードに置き換えられます。これはおそらく意図した結果ではありません:)。

_id上限付きコレクションには標準コレクションの動作にいくつかの例外があるため、完全に空のドキュメント(フィールドなし)が表示されます。

特に:

  • _idデフォルトでは、フィールドの要件はありません。autoIndexId:trueオプションを含めることで、サーバー上で生成することができます。createCollection()

  • フィールドにインデックスはありません_id(注:上限付きコレクションでレプリケーションを使用する場合は、一意のインデックスが必要になります)

また、上限付きコレクション内のドキュメントのサイズが大きくならないようにする必要があります。そうしないと、更新が失敗します。

詳細については、wikiの上限付きコレクションの使用と制限を参照してください。

于 2012-07-29T14:36:11.567 に答える