db.collectionX.save和db.collectionX.insert之间的区别

时间:2011-09-30 15:29:47

标签: mongodb

> 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 的值不会被修改。

相比之下,存储到 collectionB 后, itemB 的值会发生变化!

是否有任何规则可以指导这些修改,以便我知道在将值插入或保存到集合后应该注意什么?

谢谢

2 个答案:

答案 0 :(得分:3)

对于保存,如果您提供_id,它将会更新。如果不这样做,它将插入。关于Mongo的JavaScript shell的一个简洁的功能是,如果你在没有执行parentesis的情况下调用函数,它将返回实现。如果您对MongoDB的任何方法感到好奇并且不想整理所有源代码,这非常有用!

在JS shell中:

> 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是更新和插入的包装器。

在功能上,save和insert非常相似,特别是如果没有传递_id值。但是,如果传递了_id键,save()将更新文档,而insert()将抛出重复键错误。

答案 1 :(得分:2)

对于保存,如果您提供_id,它将会更新。如果你不这样做,它会插入,这就是差异。