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);

这有不同的语义,所以 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 回答