1

私は次のクラス構造を持っています:

public class DBTestItem
{
    public int p0;
    public int p1;
    public int p2;
    public int p3;
    public int p4;
    public int p5;
    public int p6;
    public int p7;
    public string data;
}

public sealed class MongoTestItem : DBTestItem
{
    public ObjectId _id;
}

_id は私には無意味です。p0 ~ p7 は複合キーを表し、data は値を表します。

MongoTestItemデータが一意であるドキュメントを保存したいのですが、理想的には無意味なので更新を実行せずに保存したいと考えています。つまり、データの値がコレクションに存在しない場合は保存します。

私はドキュメントを見てきましたが、上記を満たすステートメントを書く方法を見つけることができません。

p0 - p7 が複合 _id を作成し、データがリストである別の構造を作成しました。この場合、ステートメントは次のようになります。

var query = Query<MdbData>.EQ(x => x._id, doc._id);
var update = Update<MdbData>.Push(x => x.data, "somenewvalue");
col.Update(query, update, UpdateFlags.Upsert);

これはセマンティクスが異なるため、アップサートは問題ありません。

性能の違いを評価できるように、上記を書きたいと思います。

4

2 に答える 2

2

「データ」が一意の場合にのみ挿入したいということですか?もしそうなら、「データ」に一意の制約を作成し、 safeMode で更新できますか?

また、複合キーを次のように構成したくなるでしょう。

db.so.insert(
 {
    _id: {
      p0:1,
      p1:0,
      p2:0,
      p3:0,
      p4:0,
      p5:0,
      p6:0,
      p7:0,
    },
    data:"apiceofdata",
 }
);
于 2012-10-24T09:21:07.657 に答える
1

フィールド「データ」の値が他のドキュメントに表示されないかどうかを確認したいだけの場合は、の一意のインデックスを作成できますdata

dataまたは、フィールドがそのドキュメントに存在しないことを確認したい場合(更新時)、クエリ ビルダー$existで演算子を使用できます。

于 2012-10-24T09:28:38.107 に答える