Есть несколько примеров различной техники.
Предполагается, что у нас есть коллекция pets
с такими документами, как:
{
kind: "cat",
age: 2
}
и в какой-то момент мы добавили поле «ник», чтобы новые документы выглядели так:
{
kind: "cat",
age: 2,
nick: "Tom"
}
Ваше приложение требует поле "ник", чтобы перечислить домашних животных.
Использовать значения по умолчанию
Обновить старые документы значениями по умолчанию (вы можете называть его «волшебством 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" ] }
}}
])
Игнорировать недействительные документы
Удалите их:
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"}
);
Остановить выполнение программы
db.pets.find({}).forEach(pet => if(!pet.nick){throw new Error("Pet " + pet._id + " has no nick!")} );