Удалить элемент массива из ВСЕХ документов используя драйвер MongoDB C#
Учитывая следующее:
{
"_id" : 1,
"name" : "Nature",
"area": [
{
"place": "Some place",
"discoveredBy": ""
},
{
"place": "Some place 2",
"discoveredBy": ""
}
],
"_id" : 2,
"name" : "Tropics",
"area": [
{
"place": "Some place",
"discoveredBy": ""
},
{
"place": "Some place 2",
"discoveredBy": ""
}
]
}
В коде я удалил свойство foundBy. Как мне теперь обновить (сбросить) мою ВНУТРЕННУЮ базу данных, используя драйвер C#, чтобы также обнаружил, что обнаруженный Бай удаляется? Полученная БД должна выглядеть так:
{
"_id" : 1,
"name" : "Nature",
"area": [
{
"place": "Some place"
},
{
"place": "Some place 2"
}
],
"_id" : 2,
"name" : "Tropics",
"area": [
{
"place": "Some place"
},
{
"place": "Some place 2"
}
]
}
В настоящее время при попытке выполнить Find после изменения моего кода происходит сбой, потому что свойство foundBy больше не находится в коде, и процессы сериализации не могут найти место для хранения удаленного свойства, которое все еще существует в БД. Следовательно, необходимо полностью удалить это поле из БД.
ОБНОВЛЕНО РЕШЕНИЕМ:
Спасибо всем за вводную информацию, но это не дубликат, поскольку все, что я пробовал, казалось устаревшим, когда я пытался работать в C# с новым драйвером. В любом случае, вот исправление, на котором я в конце концов остановился. Ключ здесь использует "$[]", который, согласно MongoDB, является новым с версии 3.6. См. https://docs.mongodb.com/manual/reference/operator/update/positional-all/ S [] для получения дополнительной информации.
Вот код:
{
var filter = Builders<Scene>.Filter.Where(i => i.ID != null);
var update = Builders<Scene>.Update.Unset("area.$[].discoveredBy");
var result = collection.UpdateMany(filter, update, new UpdateOptions { IsUpsert = true});
}
1 ответ
В вашем случае сделайте что-то вроде этого:
db.collectionname.find({}).forEach(function(item) {
var ar = item.area;
for(var i = 0; i < ar.length; ++i) {
var x = ar[i];
delete (x["discoveredBy"]);
}
db.collectionname.save(item);});