Поиск…
замечания
Часто бывает необходимо запустить сценарии обслуживания в вашей базе данных. Поля переименовываются; изменения структуры данных; функции, которые вы использовали для поддержки, удаляются; услуги мигрируют. Список причин, по которым вы, возможно, захотите изменить свою схему, довольно безграничен. Итак, «почему» довольно понятно.
«Как» немного незнакомец. Для тех людей, которые привыкли к функциям SQL, приведенные выше сценарии базы данных будут выглядеть странно. Но обратите внимание, как все они находятся в javascript, и как они используют тот же API, что и в Meteor, как на сервере, так и на клиенте. У нас есть совместимый API через нашу базу данных, сервер и клиент.
Запустите команды миграции схемы из оболочки метеорита mongo:
# run meteor
meteor
# access the database shell in a second terminal window
meteor mongo
Добавить поле версии для всех записей в коллекции
db.posts.find().forEach(function(doc){
db.posts.update({_id: doc._id}, {$set:{'version':'v1.0'}}, false, true);
});
Удалить массив из всех записей в коллекции
db.posts.find().forEach(function(doc){
if(doc.arrayOfObjects){
// the false, true at the end refers to $upsert, and $multi, respectively
db.accounts.update({_id: doc._id}, {$unset: {'arrayOfObjects': "" }}, false, true);
}
});
Переименовать коллекцию
db.originalName.renameCollection("newName" );
Найти поле, содержащее определенную строку
С силой regex приходит большая ответственность ....
db.posts.find({'text': /.*foo.*|.*bar.*/i})
Создать новое поле из старого
db.posts.find().forEach(function(doc){
if(doc.oldField){
db.posts.update({_id: doc._id}, {$set:{'newField':doc.oldField}}, false, true);
}
});
Вытаскивать объекты из массива и места в новом поле
db.posts.find().forEach(function(doc){
if(doc.commenters){
var firstCommenter = db.users.findOne({'_id': doc.commenters[0]._id });
db.clients.update({_id: doc._id}, {$set:{'firstPost': firstCommenter }}, false, true);
var firstCommenter = db.users.findOne({'_id': doc.commenters[doc.commenters.length - 1]._id });
db.clients.update({_id: doc._id}, {$set:{'lastPost': object._id }}, false, true);
}
});
Запись Blob из одной коллекции в другую коллекцию (т. Е. Remove Join & Flatten)
db.posts.find().forEach(function(doc){
if(doc.commentsBlobId){
var commentsBlob = db.comments.findOne({'_id': commentsBlobId });
db.posts.update({_id: doc._id}, {$set:{'comments': commentsBlob }}, false, true);
}
});
Сделать конечно поле
db.posts.find().forEach(function(doc){
if(!doc.foo){
db.posts.update({_id: doc._id}, {$set:{'foo':''}}, false, true);
}
});
Сделать поле «Конечно» имеет конкретную ценность
db.posts.find().forEach(function(doc){
if(!doc.foo){
db.posts.update({_id: doc._id}, {$set:{'foo':'bar'}}, false, true);
}
});
Удалить запись, если конкретное поле является конкретным значением
db.posts.find().forEach(function(doc){
if(doc.foo === 'bar'){
db.posts.remove({_id: doc._id});
}
});
Изменение определенного значения поля для нового значения
db.posts.find().forEach(function(doc){
if(doc.foo === 'bar'){
db.posts.update({_id: doc._id}, {$set:{'foo':'squee'}}, false, true);
}
});
Отменить определенное поле до нулевого
db.posts.find().forEach(function(doc){
if(doc.oldfield){
// the false, true at the end refers to $upsert, and $multi, respectively
db.accounts.update({_id: doc._id}, {$unset: {'oldfield': "" }}, false, true);
}
});
Преобразовать ObjectId в String
db.posts.find().forEach(function(doc){
db.accounts.update({_id: doc._id}, {$set: {'_id': doc._id.str }}, false, true);
});
Преобразование значений полей из чисел в строки
var newvalue = "";
db.posts.find().forEach(function(doc){
if(doc.foo){
newvalue = '"' + doc.foo + '"';
db.accounts.update({_id: doc._id}, {$set: {'doc.foo': newvalue}});
}
});
Преобразование значений полей из строк в числа
var newvalue = null;
db.posts.find().forEach(function(doc){
if(doc.foo){
newvalue = '"' + doc.foo + '"';
db.accounts.update({_id: doc._id}, {$set: {'doc.foo': newvalue}});
}
});
Создайте временную метку из ObjectID в поле _id
db.posts.find().forEach(function(doc){
if(doc._id){
db.posts.update({_id: doc._id}, {$set:{ timestamp: new Date(parseInt(doc._id.str.slice(0,8), 16) *1000) }}, false, true);
}
});
Создайте ObjectID из объекта Date
var timestamp = Math.floor(new Date(1974, 6, 25).getTime() / 1000);
var hex = ('00000000' + timestamp.toString(16)).substr(-8); // zero padding
var objectId = new ObjectId(hex + new ObjectId().str.substring(8));
Найти все записи, содержащие элементы в массиве
То, что мы здесь делаем, ссылается на индекс массива с использованием точечной нотации
db.posts.find({"tags.0": {$exists: true }})