MongoDB расширенный справочный запрос - PullRequest
2 голосов
/ 07 июля 2011

У меня есть этот документ, в котором у меня есть массив избирателей

. Мне присвоен идентификатор (999), идентификатор ответа (123) и идентификатор избирателя (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 Ответ

1 голос
/ 07 июля 2011

Как отмечает Эндрю, вам нужно изменить структуру. Не зная, какие еще у вас есть ограничения на запросы, я не могу сделать однозначное предложение. Однако, если вы измените replies на документ вместо массива с ключами, являющимися строкой идентификатора ответа, вы можете сделать (в оболочке MongoDB):

db.test.update({_id: "999", 'replies.123.voters': { $elemMatch: {id: 10}}},
               {$set: {'replies.123.voters.$.name': "new_name"}})

Этот запрос должен быть легко составлен из ваших идентификаторов в вашем драйвере C #.

Для ясности реструктурированный документ будет выглядеть примерно так:

{
    "_id" : "999",
    "replies" : {
        "123" : {
            "text" : "Great post",
            "voters" : [
                {
                    "id" : 10,
                    "name" : "bob"
                },
                {
                    "id" : 11,
                    "name" : "john"
                }
            ],
            "votes" : 2
        }
    },
    "title" : "First post"
}

Если это не сработает, расскажите нам немного больше о вашем сценарии использования, и, возможно, мы сможем выяснить, что будет работать.

Другой альтернативой является то, что вы разбиваете ответы на их собственные коллекции, делая каждый ответ документом с полем для ссылки на родительский пост. В этом случае я подозреваю, что это может быть самое простое решение и должно иметь хорошую производительность с разумным индексом.

...