gpt4 book ai didi

MongoDB高级查询帮助

转载 作者:可可西里 更新时间:2023-11-01 10:44:50 25 4
gpt4 key购买 nike

我有这份文件,其中有选民数组

我得到了帖子 ID (999)、回复 ID (123) 和选民 ID (10)如何将第二个选民的名字从 bob 更改为 tom?

这可以使用 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"
}
],
}
]
}

编辑:我用更好的文档结构重新编写了问题。

类:我的代码仍然有原始结构相关的类。 对于我提出的新结构,这是我的类(class)的样子

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; }
}

最佳答案

正如安德鲁指出的那样,您需要更改结构。不知道您对查询还有哪些其他限制,我无法提出明确的建议。但是,如果您将 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"
}

如果这对您不起作用,请告诉我们更多关于您的用例的信息,也许我们可以找出可行的方法。

另一种选择是将回复分解到它们自己的集合中,使每个回复成为一个文档,其中包含一个字段以引用父帖子。在这种情况下,我怀疑这可能是最简单的解决方案,并且应该具有良好的性能和合理的索引。

关于MongoDB高级查询帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com