使用 MongoDB 和 C# 新 driver 版本 (2.0) 从 collection 更新嵌入式文档
Update an embedded document from a collection using MongoDB and C# new driver version (2.0)
我有一个带有嵌入式服务列表的模型:
public class Project
{
public ObjectId Id { get; set; }
public List<Service> Services { get; set; }
}
和
public class Service
{
public int Id { get; set; }
public MachineInfo Info { get; set; }
}
我想修改 Info 属性 匹配 projectId 和 serviceId 到列表的一个项目。
对于旧 driver,它是:
var result = collection.Update(
Query.And(
Query.EQ("_id", projectId),
Query.ElemMatch("Services", Query.EQ("Id", serviceId))
),
var update = Update.Set("Services.$.Info", newInfo);
Collection.Update(query, update);
但是使用新的 driver,我无法使用位置运算符 '$':
var filter = Builders<Project>.Filter.And(Builders<Project>.Filter.Eq(x => x.Id, projectId),
Builders<Project>.Filter.ElemMatch(x => x.Services, x => x.Id == serviceId));
var update = Builders<Project>.Update.Set(x => x.$.Info, newInfo);
this.collection.UpdateOneAsync(filter, update);
知道怎么做吗?使用旧版 driver ?
你可以在这里做两件事...要么像你在1.x中那样使用字符串...
Builders<Project>.Update.Set("Services.$.Info", newInfo);
或使用 ElementAt(-1)
Builders<Project>.Update.Set(x => x.Services.ElementAt(-1).Info, newInfo);
我有一个带有嵌入式服务列表的模型:
public class Project
{
public ObjectId Id { get; set; }
public List<Service> Services { get; set; }
}
和
public class Service
{
public int Id { get; set; }
public MachineInfo Info { get; set; }
}
我想修改 Info 属性 匹配 projectId 和 serviceId 到列表的一个项目。 对于旧 driver,它是:
var result = collection.Update(
Query.And(
Query.EQ("_id", projectId),
Query.ElemMatch("Services", Query.EQ("Id", serviceId))
),
var update = Update.Set("Services.$.Info", newInfo);
Collection.Update(query, update);
但是使用新的 driver,我无法使用位置运算符 '$':
var filter = Builders<Project>.Filter.And(Builders<Project>.Filter.Eq(x => x.Id, projectId),
Builders<Project>.Filter.ElemMatch(x => x.Services, x => x.Id == serviceId));
var update = Builders<Project>.Update.Set(x => x.$.Info, newInfo);
this.collection.UpdateOneAsync(filter, update);
知道怎么做吗?使用旧版 driver ?
你可以在这里做两件事...要么像你在1.x中那样使用字符串...
Builders<Project>.Update.Set("Services.$.Info", newInfo);
或使用 ElementAt(-1)
Builders<Project>.Update.Set(x => x.Services.ElementAt(-1).Info, newInfo);