如果使用 MongoDB C# 驱动程序不存在,如何插入复杂数组对象
How to insert complex array object if not exists using MongoDB C# Driver
我试图将一个对象插入到我文档的数组 属性 中,前提是该数组不包含具有相同键的另一个对象。但是我找不到使用 C# 驱动程序执行此操作的正确过滤器。详情如下。你能帮我构建过滤器吗?
这是我的模型
public class Document : Entity
{
public string Id { get; set; }
public string Name { get; set; }
public List<DocumentSubject> Subjects { get; set; }
...
}
public class DocumentSubject
{
public string Id { get; set; }
public DocumentSubjectType Type { get; set; }
public bool CanOpenIssue { get; set; }
...
}
这是我目前所做的(当然还不完整)
var filter = Filter.And(
Filter.Eq(x => x.Id, id),
"PUT SOME FILTER FOR ARRAY ITEM EXISTENCE CHECK BY ID"
);
var updater = Updater.AddToSet(x => x.Subjects, subject);
var u =Collection.UpdateOne(filter, updater);
您可以尝试以下查询。
下面的查询将使用 $elemMatch
来检查 DocumentSubject
数组中具有 id
的元素。
var queryBuilder = Builders<Document>.Filter;
var elemMatchBuilder = Builders<DocumentSubject>.Filter;
var filter = queryBuilder.Eq(document => document.Id, id) & queryBuilder.ElemMatch(document => document.Subjects, elemMatchBuilder.Ne(document => document.Id, subjectId));
var updater = Updater.Push(x => x.Subjects, subject);
var u = collection.UpdateOne(filter, updater);
我试图将一个对象插入到我文档的数组 属性 中,前提是该数组不包含具有相同键的另一个对象。但是我找不到使用 C# 驱动程序执行此操作的正确过滤器。详情如下。你能帮我构建过滤器吗?
这是我的模型
public class Document : Entity
{
public string Id { get; set; }
public string Name { get; set; }
public List<DocumentSubject> Subjects { get; set; }
...
}
public class DocumentSubject
{
public string Id { get; set; }
public DocumentSubjectType Type { get; set; }
public bool CanOpenIssue { get; set; }
...
}
这是我目前所做的(当然还不完整)
var filter = Filter.And(
Filter.Eq(x => x.Id, id),
"PUT SOME FILTER FOR ARRAY ITEM EXISTENCE CHECK BY ID"
);
var updater = Updater.AddToSet(x => x.Subjects, subject);
var u =Collection.UpdateOne(filter, updater);
您可以尝试以下查询。
下面的查询将使用 $elemMatch
来检查 DocumentSubject
数组中具有 id
的元素。
var queryBuilder = Builders<Document>.Filter;
var elemMatchBuilder = Builders<DocumentSubject>.Filter;
var filter = queryBuilder.Eq(document => document.Id, id) & queryBuilder.ElemMatch(document => document.Subjects, elemMatchBuilder.Ne(document => document.Id, subjectId));
var updater = Updater.Push(x => x.Subjects, subject);
var u = collection.UpdateOne(filter, updater);