我有这个文件,我有选民阵列
我获得了帖子ID(999),回复ID(123)和选民ID(10) 如何将第二个选民的名字从鲍勃改为汤姆?
可以使用csharp驱动程序完成吗?
posts:
{
_id: ObjectId("999"),
title : "First post",
"replies" :
[
{
"_id" : ObjectId("123"),
"text" : "Great post",
"votes" : 2,
"voters":[
{
id: 10,
name:"bob"
},
{
id: 11,
name: "john"
}
],
}
]
}
编辑:我用更好的文档结构重构了这个问题。
类:我的代码仍然具有原始结构相关的类。 对于我新建议的结构,这是我的类看起来像
public class Post
{
public Post()
{
Id = ObjectId.GenerateNewId();
title = string.empty;
}
[BsonId]
public ObjectId Id { get; set; }
public string title { get; set; }
public List<Reply> replies { get; set; }
}
public class Reply
{
public Reply()
{
Id = ObjectId.GenerateNewId();
text = string.empty;
votes = 0;
}
[BsonId]
public ObjectId Id { get; set; }
public int votes { get; set; }
public string text { get; set; }
public List<Voter> voters { get; set; }
}
public class Voter
{
public Voter()
{
name = string.empty;
}
[BsonId]
public ObjectId Id { get; set; }
public string name { get; set; }
}
答案 0 :(得分:1)
正如安德鲁指出的那样,你需要改变结构。不知道你对查询有什么其他限制,我无法提出明确的建议。但是,如果将replies
更改为文档而不是数组,并且键是回复ID字符串,则可以(在MongoDB shell中):
db.test.update({_id: "999", 'replies.123.voters': { $elemMatch: {id: 10}}},
{$set: {'replies.123.voters.$.name': "new_name"}})
此查询应该很容易根据C#驱动程序中的ID构建。
为清楚起见,重组后的文档看起来像:
{
"_id" : "999",
"replies" : {
"123" : {
"text" : "Great post",
"voters" : [
{
"id" : 10,
"name" : "bob"
},
{
"id" : 11,
"name" : "john"
}
],
"votes" : 2
}
},
"title" : "First post"
}
如果这对你不起作用,请告诉我们一些关于你的用例的信息,也许我们可以找出可行的方法。
另一种选择是你将回复分解到他们自己的集合中,使每个回复都有一个带有字段的文档来引用父帖子。在这种情况下,我怀疑这可能是最简单的解决方案,并且应该具有良好的性能和合理的索引。