Mongodb удалить вложенный дочерний запрос в C#C#

Место общения программистов C#
Ответить
Anonymous
 Mongodb удалить вложенный дочерний запрос в C#

Сообщение Anonymous »

уже некоторое время пытаюсь выполнить запрос на удаление коллекции mongodb; строго типизированные объекты, родители, вложенные дочерние элементы, каждый из которых имеет вложенных внуков. я хочу удалить конкретного внука, который находится в конкретном дочернем элементе, в конкретном родителе. я могу добраться до MatchedCount = 1, но ModifiedCount всегда равен 0, и удаление не происходит. Я пробовал много вариантов запроса, как отсюда, так и с помощью движка AI на веб-сайте mongo. ничего не работает.
Структура объекта соответствует ожиданиям:
public class Parent
{
public string Id {get; set;}
public Child[] Children {get; set;}
}

public class Child
{
public Guid Id {get; set;}
public Grandchild[] Grandchildren {get; set;}
}

public class Grandchild
{
public Guid Id {get; set;}
public string Name {get; set;}
}

вот моя последняя попытка:
var filter = Builders
.Filter.Eq(x => x.Id, parentId);

var update = Builders.Update.Pull(
"Children.$[child].GrandChildren",
Builders.Filter.Eq(gc => gc.Id, Guid.Parse(grandChildId))
);

var arrayFilters = new List
{
new BsonDocumentArrayFilterDefinition(new BsonDocument("child._id", childId))
};

var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };

var result = await _parentCollection.UpdateOneAsync(filter, update, updateOptions);

return result.ModifiedCount == 1;

обновить/удалить детей достаточно просто, но я как-то не могу добраться до внука. есть ли у кого-нибудь идеи, что я делаю неправильно?
РЕДАКТИРОВАТЬ:
на случай, если кто-то еще борется с подобным - теперь у меня есть работающее решение этой проблемы, после 3 дней (!!!) и некоторого перефразирования того, что я получил от mongodb AI. Я использовал t-sql в течение 25 лет и никогда не подозревал, что что-то настолько простое может быть так сложно понять. легко, когда знаешь как!
var filter = Builders.Filter.And(
Builders.Filter.Eq(p => p.Id, parentId),
Builders.Filter.ElemMatch(p => p.Children, c => c.Id == Guid.Parse(childId)));

var update = Builders.Update.PullFilter(
"Children.$.GrandChildren",
Builders.Filter.Eq(gc => gc.Id, Guid.Parse(grandChildId))
);

var result = await _parentCollection.UpdateOneAsync(filter, update);

return result.ModifiedCount == 1;


Подробнее здесь: https://stackoverflow.com/questions/797 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»