Удалить элемент массива из ВСЕХ документов используя драйвер 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);});
Другие вопросы по тегам