Mongodb db.collectionX.save和db.collectionX.insert之间的差异

Mongodb db.collectionX.save和db.collectionX.insert之间的差异,mongodb,Mongodb,以下是我的观察: 插入到集合a后,项a的值不会修改 相反,在存储到集合b后,项b的值会发生更改 是否有任何规则可以指导这些修改,以便我知道在将值插入或保存到集合中之后应该期望什么 感谢您保存,如果您提供_id,它将更新。如果没有,它将插入,这就是区别 对于保存,如果您提供_id,它将更新。如果不这样做,它将插入。Mongo的JavaScript shell的一个巧妙特性是,如果调用一个函数而没有执行parentesis,它将返回实现。如果您对MongoDB的任何方法感兴趣,并且不想对所有源代码进

以下是我的观察:

插入到集合a后,项a的值不会修改

相反,在存储到集合b后,项b的值会发生更改

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


感谢您保存,如果您提供_id,它将更新。如果没有,它将插入,这就是区别

对于保存,如果您提供_id,它将更新。如果不这样做,它将插入。Mongo的JavaScript shell的一个巧妙特性是,如果调用一个函数而没有执行parentesis,它将返回实现。如果您对MongoDB的任何方法感兴趣,并且不想对所有源代码进行排序,那么这将非常有用

在JS shell中:

> 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")
}
从这里,我们可以看到save是更新和插入的包装器

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

可能重复的
> 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;
}