уже некоторое время пытаюсь выполнить запрос на удаление коллекции 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
Mongodb удалить вложенный дочерний запрос в C# ⇐ C#
Место общения программистов C#
-
Anonymous
1761077302
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;
Подробнее здесь: [url]https://stackoverflow.com/questions/79755671/mongodb-delete-nested-grandchild-query-in-c-sharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия