Как отмечает Эндрю, вам нужно изменить структуру. Не зная, какие еще у вас есть ограничения на запросы, я не могу сделать однозначное предложение. Однако, если вы измените 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"
}
Если это не сработает, расскажите нам немного больше о вашем сценарии использования, и, возможно, мы сможем выяснить, что будет работать.
Другой альтернативой является то, что вы разбиваете ответы на их собственные коллекции, делая каждый ответ документом с полем для ссылки на родительский пост. В этом случае я подозреваю, что это может быть самое простое решение и должно иметь хорошую производительность с разумным индексом.