【发布时间】:2019-08-26 12:17:45
【问题描述】:
我有一个包含文档数组(或多或少复杂)的文档,我想创建 1 个查询,它将基于过滤器更新数组的元素,如果没有元素匹配,则将元素插入大批。我尝试了几件事,但没有任何效果。我不想做 2 个请求以避免并发问题。
下面是我的文档模型,它用他拥有的汽车为驾驶员建模
public string Driver{ get; set; }
public Cars[] OwnedCars{ get; set; }
假设我有一个这样的模型。
汽车可以定义如下:
Car {
color: string;
plateNumber: string
insuranceNumber: string,
options: object
.
.
.
}
问题是我可以改变汽车的颜色,买一辆新车。
我想要一个能够根据用户的车牌号添加或更新文档的请求。
我尝试了几件事:
我创建了一个如下所示的过滤器:输入 driverId、car 和 plateNumber
var filter = Builders < CarModel > .Filter.And(
Builders < ViewConfigCollStorageModel > .Filter.Eq(x = > x.Driver, driverId),
Builders < ViewConfigCollStorageModel > .Filter.ElemMatch(x = > x.ownedCars, x = > x.insuranceNumber == plateNumber));
更新可能如下所示:
var update = Builders<CarModel>.Update.Set(x => x.ownedCars[-1], car);
var res = await ViewConfigCollection.RawCollection.UpdateOneAsync(filter, update, option);
在我们可以放的选项中
var option = new UpdateOptions() { IsUpsert = true};
如果找到汽车,该集合运行良好,但如果汽车不存在,则由于位置运算符返回错误。
我尝试了 AddToSet 运算符,但如果属性与颜色不匹配,它会插入一个新对象,而我想更新现有对象。
如果您有任何想法,请不要犹豫。 谢谢 哈克
【问题讨论】: