Для сохранения, если вы предоставите _id, он обновится. Если вы этого не сделаете, он будет вставлен. Одна из полезных функций оболочки JavaScript Mongo состоит в том, что если вы вызываете функцию без выполнения парентеза, она возвращает реализацию. Это полезно, если вам интересен какой-либо из методов MongoDB и вам не хочется разбирать весь исходный код!
В оболочке JS:
> db.test.save
function (obj) {
if (obj == null || typeof obj == "undefined") {
throw "can't save a null";
}
if (typeof obj == "number" || typeof obj == "string") {
throw "can't save a number or string";
}
if (typeof obj._id == "undefined") {
obj._id = new ObjectId;
return this.insert(obj);
} else {
return this.update({_id:obj._id}, obj, true);
}
}
> db.test.insert
function (obj, _allow_dot) {
if (!obj) {
throw "no object passed to insert!";
}
if (!_allow_dot) {
this._validateForStorage(obj);
}
if (typeof obj._id == "undefined") {
var tmp = obj;
obj = {_id:new ObjectId};
for (var key in tmp) {
obj[key] = tmp[key];
}
}
this._mongo.insert(this._fullName, obj);
this._lastID = obj._id;
}
Отсюда видно, что save - это оболочка для обновления и вставки.
Функционально сохранение и вставка очень похожи, особенно если значение _id не передается. Однако, если передан ключ _id, save () обновит документ, а insert () выдаст ошибку повторного ключа.