MongoDb обновляет старые документы - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в MongoDb и концепции хранения информации в NoSQL. В отличие от SQL Server, добавление или обновление имени столбца в таблице повлияет на все записи. Я могу предположить, что когда я получу запись, этот столбец будет там. Может иметь или не иметь значение в зависимости от того, как оно было настроено.

Но как бы вы справились с ситуацией в MongoDb, когда у вас есть устаревший документ, и вы хотите извлечь его, и теперь ваш код ищет свойство, которое не существует или было недавно переименовано?

1 Ответ

0 голосов
/ 15 ноября 2018

Есть несколько примеров различной техники.

Предполагается, что у нас есть коллекция pets с такими документами, как:

{
    kind: "cat",
    age: 2
}

и в какой-то момент мы добавили поле «ник», чтобы новые документы выглядели так:

{
    kind: "cat",
    age: 2,
    nick: "Tom"
}

Ваше приложение требует поле "ник", чтобы перечислить домашних животных.

  1. Использовать значения по умолчанию

    Обновить старые документы значениями по умолчанию (вы можете называть его «волшебством ALTER TABLE» в терминах SQL):

    db.pets.updateMany({nick: {$exists: false}}, {$set: {nick: "NONAME"}});
    

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

    На стороне приложения:

    db.pets.find({}).forEach(pet => print(p.nick || "NONAME") );
    

    На стороне БД:

    db.pets.aggregate([
        {$project: {
            kind: 1,
            age: 1,
            nick: { $ifNull: [ "$nick", "NONAME" ] }
        }}
    ])
    
  2. Игнорировать недействительные документы

    Удалите их:

    db.pets.remove({nick: {$exists: false}})
    

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

    db.pets.find({
        kind: {$exists: true},
        age: {$exists: true},
        nick: {$exists: true}
    );
    

    Вы можете сделать его более оборонительным, указав type :

    db.pets.find({
        kind: {$type: "string"},
        age: {$type: "int"},
        nick: {$type: "string"}
    );
    
  3. Остановить выполнение программы

    db.pets.find({}).forEach(pet => if(!pet.nick){throw new Error("Pet " + pet._id + " has no nick!")} );
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...