Поиск…


замечания

Часто бывает необходимо запустить сценарии обслуживания в вашей базе данных. Поля переименовываются; изменения структуры данных; функции, которые вы использовали для поддержки, удаляются; услуги мигрируют. Список причин, по которым вы, возможно, захотите изменить свою схему, довольно безграничен. Итак, «почему» довольно понятно.

«Как» немного незнакомец. Для тех людей, которые привыкли к функциям 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 }})


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow