【发布时间】:2017-12-26 10:26:27
【问题描述】:
如何修改MongoDB文档子数组中的子元素?我正在使用最新的 C# MongoDB 驱动程序(C# 驱动程序版本:2.5,服务器版本:3.2.0),我已经尝试了来自多个答案的解决方案SO(也有重复的问题)和其他各种来源。大多数解决方案都被证明是过时的。
以下是我的示例文档:
[{
"_id" : "69c4f77d-05ef-431d-ae17-c076c6173e04",
"title" : "Root Page",
"createdAt" : ISODate("2017-12-21T12:28:00.680+0000"),
"modifiedAt" : ISODate("2017-12-26T07:18:11.165+0000"),
"pages" : [
{
"_id" : "f449dc0b-3d1b-4a59-b622-6a42ce10b147",
"title" : "Test page 1",
"slug" : "test-page-1",
"createdAt" : ISODate("2017-12-21T12:28:00.680+0000"),
"modifiedAt" : ISODate("2017-12-21T12:28:00.680+0000")
},
{
"_id" : "3d1497d7-f74c-4d88-b15c-bf2f9c736374",
"title" : "Test page 2",
"slug" : "test-page-2",
"createdAt" : ISODate("2017-12-25T11:27:55.006+0000"),
"modifiedAt" : ISODate("2017-12-25T11:27:55.006+0000")
},
{
"_id" : "6e827e2a-5a25-4343-b646-885816bb8cc4",
"title" : "Test page 3",
"slug" : "test-page-3",
"createdAt" : ISODate("2017-12-25T11:31:16.516+0000"),
"modifiedAt" : ISODate("2017-12-25T11:31:16.516+0000")
}]
},
...,
...
]
文档结构: 根文档包含一组子文档,其中包含元数据和页面列表(数组)
在子文档中 - 我正在尝试更新 pageschild page 对象的 title 和 slug /strong> 数组,但到目前为止还没有最新的驱动程序。
我正在使用以下过滤器和更新查询:
var filter = Builders<SubDocument>.Filter.And(Builders<SubDocument>.Filter.Eq("_id", "xxx"), Builders<SubDocument>.Filter.ElemMatch(x => x.Pages, p => p.Id == "xxx"));
var update = Builders<SubDocument>.Update
.Set("pages.$.title", "changed title")
.Set("pages.$.slug", "changed-title")
.Set("pages.$.modifiedAt", DateTime.UtcNow);
_mongoDb.Documents.UpdateOne(filter, update);
现在 - 这个查询返回一个错误:
无效的 BSON 字段名称 pages.$.title
我过去几个小时的参考资料说要使用“$”运算符,但它会在最新的驱动程序中引发错误。
[编辑 1]这是我的模型:
public class SubDocument
{
public SubDocument()
{
Id = Guid.NewGuid().ToString();
CreatedAt = DateTime.UtcNow;
ModifiedAt = DateTime.UtcNow;
Pages = new List<Page>();
}
[BsonId]
public string Id { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; }
[BsonElement("modifiedAt")]
public DateTime ModifiedAt { get; set; }
[BsonElement("pages")]
public List<Page> Pages { get; set; }
}
public class Page
{
[BsonId]
public string Id { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("slug")]
public string Slug { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; }
[BsonElement("modifiedAt")]
public DateTime ModifiedAt { get; set; }
}
有人吗?提前致谢!
【问题讨论】:
-
您需要更新哪个元素以及更新到哪个值?还是所有页面?你有过滤器吗?
-
嗨@Evk,我已经更新了问题,PS,谢谢!
-
您还可以为您的子文档包含模型吗?只是为了方便复制粘贴
-
无论如何,尝试这样做:
.Set(c => c.Pages[-1].Title, "changed title")(其他字段也一样)。 -
您发布的相同代码(以及我的建议)适用于我的驱动程序版本 2.5 和 mongo 版本 3.4
标签: c# mongodb mongodb-query mongodb-.net-driver