仅当所有字段都是唯一的时,才将文档插入MongoDB

时间:2012-10-24 09:10:37

标签: mongodb mongodb-.net-driver database

我有以下类结构:

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表示复合键,数据表示值。

我希望保存数据唯一的MongoTestItem个文档,理想情况下不会执行更新,因为它们毫无意义。换句话说,如果集合中不存在数据值,则保存。

我查看了文档,但是无法找到如何编写语句以满足上述要求。

我确实创建了一个不同的结构,其中p0 - p7构成复合_id,数据是List,在这种情况下语句如下:

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是可以的。

我想写上面的内容,以便我可以评估性能差异。

2 个答案:

答案 0 :(得分:2)

您是说只想在“数据”是唯一的情况下插入?如果是这样,您是否可以在“数据”上创建唯一约束,并使用safeMode进行更新?

我也很想像这样构建你的复合键;

db.so.insert(
 {
    _id: {
      p0:1,
      p1:0,
      p2:0,
      p3:0,
      p4:0,
      p5:0,
      p6:0,
      p7:0,
    },
    data:"apiceofdata",
 }
);

答案 1 :(得分:1)

如果您只是想检查字段'data'的值是否未显示在其他文档中,您可以为data创建唯一索引。

或者,如果您想检查该文档中不存在data字段(更新时),您可以将$exist运算符与Query Builder

一起使用