在说MongoDB数据插入操作之前,我们先来简单了解下它的数据逻辑结构.MongoDB的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。文档(document)由键/值对构成,像{a:1};{s:"abc"}等,它是MongoDB核心单元.MongoDB的文档(document),相当于关系数据库中的一行记录。多个文档组成一个集合(collection),相当于关系数据库的表。多个集合(collection),逻辑上组织在一起,就是数据库(database)。一个MongoDB实例支持多个数据库(database)。下面我们步入正题:MongoDB数据插入操作.插入函数应该是insert函数,可是我发现很多人都在用save,甚至比insert用得更勤,不知道是因单词拼字难易还是其他什么.总之,我们先来看看怎么操作吧
首先,我们进入test数据库,其中创建了个user集合,我们打算往这个集合里面插入文档.
> db
test
> show collections
system.indexes
system.users
user
插入函数可以直接接收文档做为它的参数,也可以先把文档赋值给变量,再接收变量做为自己的参数,下面是只接以文档做为参数来插入数据:
> db.user.insert({fname:"jeff",lname:"jiang"})
> db.user.find()   #find函数相当于SQL里面的select,查询数据的功能.可以看到,之前的操作已经把数据插入进去了
{ "_id" : ObjectId("502cbc35e81129d4cd4dcf2f"), "fname" : "jeff", "lname" : "jiang" }
> db.user.save({fname:"xiaoqiang",lname:"he"})
> db.user.find()    #之前的操作已经把数据插入进去了
{ "_id" : ObjectId("502cbc35e81129d4cd4dcf2f"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("502cbdbfe81129d4cd4dcf30"), "fname" : "xiaoqiang", "lname" : "he" }
接着,是把文档赋值给变量,再接收变量做为自己的参数来进行插入操作,这种方法在要对同一个文档进行多次操作时会很有用:
> i={fname:"chengcheng",lname:"zhang"}
{ "fname" : "chengcheng", "lname" : "zhang" }
> j={fname:"dengdeng",lname:"pan"}
{ "fname" : "dengdeng", "lname" : "pan" }
> db.user.insert(i)
> db.user.save(j)
> db.user.find()     #之前的操作已经把数据插入进去了
{ "_id" : ObjectId("502cbc35e81129d4cd4dcf2f"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("502cbdbfe81129d4cd4dcf30"), "fname" : "xiaoqiang", "lname" : "he" }
{ "_id" : ObjectId("502cbe72e81129d4cd4dcf31"), "fname" : "chengcheng", "lname" : "zhang" }
{ "_id" : ObjectId("502cbe75e81129d4cd4dcf32"), "fname" : "dengdeng", "lname" : "pan" }
说了这么多,基本插入操作也基本会了.但insert和save函数到底有什么区别呢.不急,在SQL中,我们想到可以用
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (...),(...),...来进行一次插入多条记录.那么,在MongoDB中,我们是否也可以用insert或save函数来进行一次插入多条记录呢?我们先来试试看看:
> db.user.insert({ "fname" : "dengdeng", "lname" : "pan" },{ "fname" : "chengcheng", "lname" : "zhang" })
> db.user.find()
{ "_id" : ObjectId("505275657916a431166639b4"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("505275b47916a431166639b5"), "fname" : "xiaoqiang", "lname" : "he" }
{ "_id" : ObjectId("505276897916a431166639b6"), "fname" : "cheng", "lname" : "zhang" }
{ "_id" : ObjectId("505276907916a431166639b7"), "fname" : "dengdeng", "lname" : "pan" }
{ "_id" : ObjectId("50529cf17916a431166639bd"), "fname" : "dengdeng", "lname" : "pan" }
查看结果显示,数据插是插入进去了,但不是我们想象中那样,它默认把第二个参数"忽略"了.下面再看看save函数的插入情况:
> db.user.save({ "fname" : "dengdeng", "lname" : "pan" },{ "fname" : "chengcheng", "lname" : "zhang" })
> db.user.find()
{ "_id" : ObjectId("505275657916a431166639b4"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("505275b47916a431166639b5"), "fname" : "xiaoqiang", "lname" : "he" }
{ "_id" : ObjectId("505276897916a431166639b6"), "fname" : "cheng", "lname" : "zhang" }
{ "_id" : ObjectId("505276907916a431166639b7"), "fname" : "dengdeng", "lname" : "pan" }
{ "_id" : ObjectId("50529cf17916a431166639bd"), "fname" : "dengdeng", "lname" : "pan" }
{ "_id" : ObjectId("50529d207916a431166639be"), "fname" : "dengdeng", "lname" : "pan" }
结果也不是同时插入了两条记录,它也默认把第二个参数"忽略"了.那么,我们试试它们是不是真的把第二个参数忽略了呢,下面试试以变量当参数插入数据看看什么情况:
> i={fname:"chengcheng",lname:"zhang"}
{ "fname" : "chengcheng", "lname" : "zhang" }
> j={fname:"dengdeng",lname:"pan"}
{ "fname" : "dengdeng", "lname" : "pan" }
> db.user.insert(i,j)
> db.user.find()
{ "_id" : ObjectId("505275657916a431166639b4"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("505275b47916a431166639b5"), "fname" : "xiaoqiang", "lname" : "he" }
{ "_id" : ObjectId("505276897916a431166639b6"), "fname" : "cheng", "lname" : "zhang" }
{ "_id" : ObjectId("505276907916a431166639b7"), "fname" : "dengdeng", "lname" : "pan" }
{ "_id" : ObjectId("50529bfd7916a431166639bb"), "fname" : "chengcheng", "lname" : "zhang" }
> i
{ "fname" : "chengcheng", "lname" : "zhang" }
> j
{ "fname" : "dengdeng", "lname" : "pan" }
> db.user.save(i,j)
> db.user.find()
{ "_id" : ObjectId("505275657916a431166639b4"), "fname" : "jeff", "lname" : "jiang" }
{ "_id" : ObjectId("505275b47916a431166639b5"), "fname" : "xiaoqiang", "lname" : "he" }
{ "_id" : ObjectId("505276897916a431166639b6"), "fname" : "cheng", "lname" : "zhang" }
{ "_id" : ObjectId("505276907916a431166639b7"), "fname" : "dengdeng", "lname" : "pan" }
{ "_id" : ObjectId("50529bfd7916a431166639bb"), "fname" : "chengcheng", "lname" : "zhang" }
{ "_id" : ObjectId("50529c1d7916a431166639bc"), "fname" : "chengcheng", "lname" : "zhang" }
> i
{
 "fname" : "chengcheng",
 "lname" : "zhang",
 "_id" : ObjectId("50529c1d7916a431166639bc")
}
> j
{ "fname" : "dengdeng", "lname" : "pan" }
看到没有,数据还是和之前一样的情况插入集合了,所以想像insert语句那样一起插入多条数据好像不太可能,不过我们可以使用循环或者批量插入数据工具(mongoimport).这里我们先不说批量插入.注意,insert和save的区别来了.insert函数不会改变变量值,而save函数把第一个变量的值改变了.为什么会这样呢,来看看它们的函数代码.MongDB有个很方便的地方,只打函数的名字而不加括号,就能查看该函数的功能用法.
> 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);
    }
}
由上面可以看出,save函数实际就是根据参数条件,调用了insert或update函数.如果想插入的数据对象存在,insert函数会报错,而save函数是改变原来的对象;如果想插入的对象不存在,那么它们执行相同的插入操作.这里可以用几个字来概括它们两的区别,即所谓"有则改之,无则加之".

MongoDB数据插入insert和save操作相关推荐

  1. Mongodb数据库命令端经常使用操作

    数据库基本命令操作 数据库经常使用命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.he ...

  2. 如何确认mongodb数据插入是否成功_go连接mongodb

    mongodb介绍 mongodb是基于分布式文件存储的数据库,一条数据存储为一个文档document,数据结构是由key-value对组成,文档类类似于平时使用的json对象.文档中字段值可以包含其 ...

  3. 数据插入INSERT

    一.INSERT SELECT :将查询的数据直接插入 特点: 1.一次性插入所有查询出来的数据. 2.数据原子性,有一个失败全部失败. 3.没有指定的列加默认值或NULL,都没有就报错. 二.INS ...

  4. mysql 插入数据 自增长_MySQL ------ 插入数据(INSERT和insert select)(二十)

    数据插入(INSERT): 用来插入(或添加)行到数据表中.也可利用mysql 的安全机制机制使用insert 语句 可使用的四种方式:插入完整的行,插入行的一部分,插入多行和插入某些查询结果 一.插 ...

  5. insert exec 语句不能嵌套_MySQL ------ 插入数据(INSERT和insert select)(二十)

    数据插入(INSERT): 用来插入(或添加)行到数据表中.也可利用mysql 的安全机制机制使用insert 语句 可使用的四种方式:插入完整的行,插入行的一部分,插入多行和插入某些查询结果 一.插 ...

  6. ClickHouse 数据插入、更新与删除操作 SQL

    1.1. 数据操作 数据操作语言( DML,Data Manipulation Language ) 用于在数据库表中添加(插入).删除和修改(更新)数据.本节主要介绍ClickHouse中的数据插入 ...

  7. 数据有序_详解数据库插入性能优化:合并+事务+有序数据进行INSERT操作

    概述 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意 ...

  8. 通过nodejs插入删除MongoDB数据

    通过nodejs插入删除MongoDB数据 首先确保你已经启动了Mongodb数据库服务(mongoDB默认的端口号是:27017) nodejs端,插入数据代码: var MongoClient = ...

  9. SQL语言之DML语言学习(一) 数据插入与修改操作语言

    数据操作语言: 插入: insert 修改: update 删除:delete -.插入语句 方式一 语法: insert into表名(列名,-) values(值1,- ) ; INSERT IN ...

  10. 使用REVERSE INDEX改善大规模数据插入【IMPROVE INSERT STATEMENT USING REVERSE INDEX】

    我们有的一个应用系统需要在某些时段向其日志记录表中集中插入数据.   通过观察发现该表的一些特征;   1.主键是使用SEQUENCE单调递增生成的.   2.对日志表的查询不会扫描多条连续记录(主键 ...

最新文章

  1. 一个小小的AI训练营竟然卧虎藏龙
  2. Asp.net Mvc Post ID Bug
  3. 如果学习编程可以重来
  4. 自定义消息编码绑定实现
  5. Windows四大傻X功能——那些拖慢系统性能的罪魁祸首
  6. 根据ip地址获得天气预报
  7. 【PyQt5】QT designer + eclipse 集成开发
  8. jeecg自定义按钮使用exp属性不起作用
  9. java架构师进阶独孤九剑系列(一):数据结构与算法
  10. 音视频开发(26)---H.264编码格式和视频编码的一些基本概念
  11. 线程池的submit和execute方法区别
  12. python效率低为什么_为什么我的工作效率降低了?
  13. java骨架_基于Mat变换的骨架提取Java
  14. 显示not_Excel函数06:逻辑函数之OR、NOT函数应用实例分析
  15. CSDN新版下载频道介绍之三——用户权限及积分规则详解
  16. 【渝粤教育】广东开放大学 跨文化商务沟通 形成性考核 (42)
  17. Oracle开发 之 主-外键约束FK及约束的修改
  18. 打印机驱动的PCL与PS的区别
  19. 图像算法原理与实践——图像修复之 全变分模型
  20. SNMP协议以及著名的MIB详解

热门文章

  1. IPtables中SNAT、DNAT和MASQUERADE的含义 (转)
  2. [硬件]_ELVE_VS2015下opencv3.3的配置问题
  3. 远程服务RMI源码解析(二)
  4. 20162327WJH第五周作业
  5. 6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief
  6. 《实用python程序设计》练习题:向量点积计算
  7. 计算机主机的储存,电脑截屏保存在哪里 电脑截屏保存位置【图文】
  8. 广州电子路考视频发布 2014广州电子路考考点
  9. Minecraft安装资源包
  10. android系统已停止运用,安卓系统平板电脑启动器停止运行处理方法(文/明)