我有以下类结构:
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是可以的。
我想写上面的内容,以便我可以评估性能差异。
答案 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