mongodb的save和insert函数的区别


  • 註冊用戶

    前言:
    在mongodb中,save和insert函数都能向collection里面插入数据,但插入数据时两者还是有一定的区别的。

    一、两者区别:

    • 使用insert函数,如果插入的集合的“_id”值,在集合中已经存在,用Insert执行插入操作会报异常:已经存在"_id"的键。用Save函数的话,如果系统中没有相同的"_id"就执行插入操作,有的话就执行覆盖掉原来的值。

    • 当我们使用外部应用调用 这个两个函数时:insert可以一次性插入一个列表,而不用遍历,效率高,因为insert函数内部已经实现循环, 而使用save函数的话,则需要外面应用程序遍历列表,一个个插入。所以对于远程调用来说,一次性将整个列表传送给mongodb,让mongodb去自己处理,这样效率会高些。

    下面我们看下这两个函数的原型就清楚了,直接输入函数名便可以查看原型,下面黑色的部分实现了循环。

    >>> db.user.insert

    function (obj, _allow_dot) {

    if (!obj) {

    throw “no object passed to insert!”;

    }

    if (!_allow_dot) {

    this._validateForStorage(obj);

    }

    if (typeof obj._id == “undefined” && !Array.isArray(obj)) {

        var tmp = obj;
    
        obj = {_id:new ObjectId};
    
        for (var key in tmp) {
    
            obj[key] = tmp[key];
    
        }
    
    }
    

    this._db._initExtraInfo();

    this._mongo.insert(this._fullName, obj);

    this._lastID = obj._id;

    this._db._getExtraInfo(“Inserted”);

    }

    >>> db.user.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);

    }

    }

    二、实例:使用python实现向mongo插入数据的代码
    >>> import pymong

    >>>log_test =[ ]

    >>>log_test.append({“name”:"epyth",”time”:0.2})

    >>>log_test.append({“name”:"omiga",”time”:0.12})

    >>>log_test.append({“name”:"theta",”time”:0.24})

    >>>def addLogToMongo(db,log_test):

    #建立一个到mongo数据库的连接
    >>>con = pymongo.MongoClient(db,27017)

    #连接到指定数据库
    >>>db = con.my_collection

    #直接插入数据,log_test是一个列表变量,可以使用insert直接一次性向mongoDB插入整下列表,如果用save的话,需一使用for来循环一个个插入,效率不高
    使用insert函数:
    >>>db.logDetail.insert(log_test)

    使用save函数:
    >>>for name in log_test:

    >>>print(str(name))

    >>>db.logDetail.save(name)


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待