Mar*_*wen 5 .net c# mongodb mongodb-.net-driver
如果我有一个包含嵌入式部门的公司集合:
{
"_id": 1
"_t": "Company",
"Name": "Test Company"
"Divisions": [
{
"_id": 1
"_t": "Division",
"Name": "Test Division 1"
},
{
"_id": 2
"_t": "Division",
"Name": "Test Division 2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
使用官方10gen C#驱动程序时保存/更新整个部门的最佳方法是什么?(最新的0.9版本.)
我正在使用Update.AddToSetWrapped来添加Divisions,这很好用,但我也希望能够根据它们的_id更新文档.
例如,如果我定义以下Update方法:
public void UpdateDivision(IDivision division)
{
var mongo = MongoServer.Create(_connectionString);
var database = mongo.GetDatabase(_databaseName);
var query = Query.EQ("_id", division.CompanyId);
var update = Update.AddToSetWrapped("Divisions", division);
database.GetCollection<Company>("Company")
.Update(query, update, UpdateFlags.Upsert, SafeMode.True);
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
var division = GetDivisionById(1);
division.Name = "New Name";
UpdateDivision(division);
Run Code Online (Sandbox Code Playgroud)
然后将一个新的Division实例添加到集合中,因为虽然"_id"仍然是1,但Name是不同的,因此它是一个唯一的文档.
那么有什么更新整个嵌入式文档的好方法呢?
直到我想出一个更好的解决方案,我将首先$pull进入原来的分部,然后再$addToSet进行修改后的分部.这有效,但显然不理想,因为它执行两个单独的更新.
Rob*_*tam 11
您可以使用MongoDB的位置数组修改功能一次更新数组中的整个分区,如下所示:
var division = GetDivisionById(1);
division.Name = "New Name";
// change any other properties of division you want
collection.Update(
Query.EQ("Divisions._id", 1),
Update.Set("Divisions.$", BsonDocumentWrapper.Create<IDivision>(division))
);
Run Code Online (Sandbox Code Playgroud)
这里发生的关键事情是:
| 归档时间: |
|
| 查看次数: |
7788 次 |
| 最近记录: |