Разница между db.collectionX.save и db.collectionX.insert - PullRequest
5 голосов
/ 30 сентября 2011
> itemsA = { attrA : "vA", attrB : "vB" }
{ "attrA" : "vA", "attrB" : "vB" }
> db.collectionA.insert(itemsA)
> db.collectionA.find()
{ "_id" : ObjectId("4e85de174808245ad59cc83f"), "attrA" : "vA", "attrB" : "vB" }
> itemsA
{ "attrA" : "vA", "attrB" : "vB" }


> itemsB = { attrC : "vC", attrD : "vD" }
{ "attrC" : "vC", "attrD" : "vD" }
> db.collectionB.save(itemsB)
> db.collectionB.find()
{ "_id" : ObjectId("4e85de474808245ad59cc840"), "attrC" : "vC", "attrD" : "vD" }
> itemsB
{
    "attrC" : "vC",
    "attrD" : "vD",
    "_id" : ObjectId("4e85de474808245ad59cc840")
}

Вот мое наблюдение:

После вставки в collectionA значение itemsA не изменяется.

InВ отличие от этого, после сохранения в collectionB значение itemB изменяется!

Существует ли какое-либо правило, управляющее этими изменениями, чтобы я знал, чего следует ожидатьпосле того, как значение будет вставлено или сохранено в коллекции?

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 января 2013

Для сохранения, если вы предоставите _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 () выдаст ошибку повторного ключа.

2 голосов
/ 09 июля 2012

Для сохранения, если вы предоставите _id, он обновится. Если вы этого не сделаете, он вставит, вот в чем различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...