MongoDB高级查询帮助

时间:2011-07-07 09:15:47

标签: mongodb mongodb-.net-driver

我有这个文件,我有选民阵列

我获得了帖子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; }
}

1 个答案:

答案 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"
}

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

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