MongoDB教程之数据操作实例

1.  批量插入:

以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销。就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据。对于数据导入而言,我们可以使用mongoimport完成。
 
2.  数据库清除:


代码如下:

> db.users.remove()

以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引。数据删除操作是不可恢复的,一旦删除就物理的删除了。对于全集合清除这种case,一个更为有效的方式是直接删除集合对象本身以及他关联的所有索引,之后再依次重建,如:
 

代码如下:

> db.one_collection.drop()

3.  数据更新: 

如果在执行数据更新时,有多条文档匹配更新条件,为了避免更新后的_id出现重复性冲突,MongoDB将仅更新第一条查询结果,如:
 

代码如下:

> post1 = { "name": "stephen", "age" : "35"}
    { "name" : "stephen", "age" : "35" }
    > post2 = { "name": "stephen", "age" :  36}
    { "name" : "stephen", "age" : 36 }
    > db.blog.insert(post1)
    > db.blog.insert(post2)
    > post3 = { "name" : "stephen", "age": 37}
    { "name" : "stephen", "age" : 37 }
    > db.blog.update({"name":"stephen"},post3)
    > db.blog.find()
    { "_id" : ObjectId("4fcd7e2e20668578cc1097d8"), "name" : "stephen", "age" : 36 }
    { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 37 }

4.  修改器:

使用修改器进行数据更新是原子的,也是高效的,不同于全部文档更新的是被更新文档的_id不会变化,而文档完全更新则会修改文档的_id,以及相关的索引。
  

代码如下:

> db.blog.find()
    { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 41 }
    { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }
    --$inc修改符将匹配条件的文档的age键原子加一,缺省情况下只是更新第一条符合条件的文档。
    > db.blog.update({"name":"stephen"},{"$inc":{"age":1}}) 
    > db.blog.find()
    { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 42 }
    { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }
    --可以通过update函数的最后一个参数来指定更新所有符合条件的文档,如:
    > db.blog.update({"name":"stephen"},{"$inc":{"age":1}},true,true)
    > db.blog.find()
    { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 43 }
    { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 39 }

--$set修改符直接修改匹配文档的内容,如果修改的键存在则直接修改,否则新增。
    > db.blog.update({"name":"stephen"},{"$set":{"genda":"male"}})
    > db.blog.find()
    { "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "genda" : "male", "name" : "stephen" }
    --$unset修改符合$set的功能是完全相反的,如:
    > db.blog.update({"name":"stephen"},{"$unset":{"genda":"male"}})
    > db.blog.find()
    { "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "name" : "stephen" }
    --可以通过$set修改符修改嵌套子文档。
    > db.blog.find()
    { "_id" : ObjectId("4fcd8e0220668578cc1097db"), "title" : "A Blog Post", "author" : { "name" : "joe", "email" : "joe@ee.com" } }
    > db.blog.update({"title":"A Blog Post"},{"$set":{"author.name":"joe schmoe"}})
    > db.blog.find()
    { "_id" : ObjectId("4fcd8e0220668578cc1097db"), "author" : { "email" : "joe@ee.com", "name" : "joe schmoe" }, "title" : "A Blog Post" }

5.  数组修改器:

代码如下:

> db.blog.insert({"title":"one blog"})
    > db.blog.find()
    { "_id" : ObjectId("4fcd909520668578cc1097dc"), "title" : "one blog" }
    --如果其操作的键不存在,则创建新的键值,其值的类型为数组类型。
    > log.update({"title":"one blog"}, {"$push": {"comments":{"content":"hello"}}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fcd909520668578cc1097dc"),
         "comments" : [
                 {
                         "content" : "hello"
                 }
         ],
         "title" : "one blog"
    }
    --如果$push操作的键值已经存在,且其值为数组类型,该修改符将为该数组添加新的数组元素。
    > db.blog.update({"title":"one blog"}, {"$push": {"comments":{"content":"word"}}
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fcd909520668578cc1097dc"),
         "comments" : [
                 {
                         "content" : "hello"
                 },
                 {
                         "content" : "word"
                 }
         ],
         "title" : "one blog"
    }
 
    > post = {"username":"joe", "emails":["joe@example.com","joe@gmail.com","joe@yahoo.com"]}
    {
         "username" : "joe",
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com"
         ]
    }
    > db.blog.insert(post)
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "username" : "joe",
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com"
         ]
    }
    --$addToSet适用于数组,如果数组中该元素已经存在,该命令就不做任何操作后返回,否则将新元素插入数组。
    > db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@gmail.com"}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "username" : "joe",
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com"
         ]
    }
    > db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@hotmail.com"}
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com",
                 "joe@hotmail.com"
         ],
         "username" : "joe"
    }
    --$addToSet和$each的组合可以将数组插入到另外一个数组中。
    > db.blog.update({"username":"joe"},{"$addToSet": {"emails":{"$each":["joe@php.net","joe@example.com"]}}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com",
                 "joe@hotmail.com",
                 "joe@php.net"
         ],
         "username" : "joe"
    }
    --$pop从数组中删除一个元素,如参数为1,表示从数组的尾部删除一个元素,如果是-1,则从头部删除。
    > db.blog.update({"username":"joe"}, {"$pop":{"emails":1}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@example.com",
                 "joe@gmail.com",
                 "joe@yahoo.com",
                 "joe@hotmail.com"
         ],
         "username" : "joe"
    }
    > db.blog.update({"username":"joe"}, {"$pop":{"emails":-1}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@gmail.com",
                 "joe@yahoo.com",
                 "joe@hotmail.com"
         ],
         "username" : "joe"
    }
    --$pull修改符则是从数据中删除指定的元素
    > db.blog.update({"username":"joe"}, {"$pull":{"emails":"joe@yahoo.com"}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@gmail.com",
                 "joe@hotmail.com"
         ],
         "username" : "joe"
    }
    --使数组中出现重复的元素,便于后面修改符的功能演示。
    > db.blog.update({"username":"joe"}, {"$push": {"emails":"joe@gmail.com"}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@gmail.com",
                 "joe@hotmail.com",
                 "joe@gmail.com"
         ],
         "username" : "joe"
    }
    --在数组中,第一个元素的下标是0,然后依次增长。下面的示例是将数组中下标为1
    --(第二个元素)的元素值修改为新值。
    > db.blog.update({"username":"joe"}, {"$set":{"emails.1":"joe@example.com"}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@gmail.com",
                 "joe@example.com",
                 "joe@gmail.com"
         ],
         "username" : "joe"
    }
    --有的时候,特别是在修改查询结果的时候,我们无法获知结果文档数组下标,MongoDB
    --提供了$定位符表示查询结果的下标。但是该他只更新第一个匹配元素。
    > db.blog.update({"emails":"joe@gmail.com"},{"$set":{"emails.$":"joe@hotmail.com"}})
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2e468b2ac404941134bed"),
         "emails" : [
                 "joe@hotmail.com",
                 "joe@example.com",
                 "joe@gmail.com"
         ],
         "username" : "joe"
   }

6.  upsert:

upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
   

代码如下:

> db.blog.remove()
    > db.blog.update({"username":"joe"},{"username":"joe","age":30},true)
    > db.blog.findOne()
    {
         "_id" : ObjectId("4fd2faac576cd9c101ac0f3d"),
         "username" : "joe",
         "age" : 30
    }

下面的示例可以在新增的同时,修改新增后的值。
 

代码如下:

> db.blog.remove()
    > db.blog.update({"count":25},{"$inc":{"count":3}},true)
    > db.blog.find()
    { "_id" : ObjectId("4fd2fd59576cd9c101ac0f3e"), "count" : 28 }

save是一个shell函数,可以在文档不存在时插入,存在时更新。upsert也可以完成同样的工作,但是不如save命令方便。
 

代码如下:

> var x = db.blog.findOne()
    > x.count = 40
    40
    > db.blog.save(x)
    > db.blog.findOne()
    { "_id" : ObjectId("4fd2fde4576cd9c101ac0f3f"), "count" : 40 }

7.  返回已更新文档:

可以通过getLastError命令获取更新多个文档时被更新的文档数量。
 

代码如下:

> db.blog.remove()
    > db.blog.insert({"name":"stephen"})
    > db.blog.insert({"name":"stephen3"})
    > db.blog.insert({"name":"stephen4"})
    > db.blog.update({},{"$set":{"name":"liu"}},false,true)
    --n:3表示修改的数量为3。
    > db.runCommand({getLastError:1})
    {
        "updatedExisting" : true,
        "n" : 3,
        "connectionId" : 1,
        "err" : null,
        "ok" : 1
    }

findAndModify可以原子性的修改查询结果,也可以原子性的删除查询结果。
 

代码如下:

> db.blog.insert({"name":"stephen"})
    > db.blog.insert({"name":"stephen2"})
    > db.blog.find()
    { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
    { "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen2" }        
    > db.runCommand({"findAndModify":"blog", "query":{"name":"stephen2"},"update":{"$set":{"name":"stephen3"}}})
    > db.blog.find()
    { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
    { "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen3" }
    > runCommand({"findAndModify":"blog", "query":{"name":"stephen3"},"remove":true})
    > db.blog.find()
    { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }

findAndModify命令中每个键对应的值如下:
    findAndModify: 字符串类型的集合名称。
    query:查询文档,用来检索文档的条件。
    sort: 排序结果的条件。
    update:修改文档,对所找到的文档执行的更新。
    remove:布尔类型,表示是否删除文档。
    new:布尔类型,表示返回的是更新前的文档还是更新后的文档。缺省是更新前文档。
    update和remove必须有一个存在,也只能有一个存在。如果没有匹配的文档,该命令会返回一个错误。这个命令有些限制,即一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。

(0)

相关推荐

  • MongoDB教程之聚合(count、distinct和group)

    1. count: 复制代码 代码如下: --在空集合中,count返回的数量为0.     > db.test.count()     0     --测试插入一个文档后count的返回值.     > db.test.insert({"test":1})     > db.test.count()     1     > db.test.insert({"test":2})     > db.test.count()     2  

  • MongoDB教程之入门基础知识

    一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" : "male" } 不等于 { "genda" : "male", "name" : "stephen" } 2.  文档信息是大小写敏感的,如:{ "name" : "stephen" } 不等于

  • MongoDB教程之索引介绍

    一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:   复制代码 代码如下: > db.test.ensureIndex({"username":1}) 可以通过下面的名称查看索引是否已经成功建立:   复制代码 代码如下: > db.test.getIndexes() 删除索引的命令是:   复制代码 代码如下: > db.test.dropIndex({"username"

  • MongoDB教程之基本管理命令

    1.  启动和停止MongoDB: 执行mongod命令启动MongoDB服务器.mongod有很多可配置的选项,我们通过mongod --help可以查看所有选项,这里仅介绍一些主要选项:   复制代码 代码如下: --dbpath:     缺省情况下数据库的数据目录为/data/db.对于Windows平台,如果当前的可执行文件位于D盘,那么其缺省数据目录为D:\data\db.我们可以通过这个选项为服务程序重新指定数据目录.如果当前主机运行多个mongod,那么必须为每个服务程序指定不同

  • MongoDB教程之数据操作实例

    1.  批量插入: 以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据.对于数据导入而言,我们可以使用mongoimport完成.   2.  数据库清除: 复制代码 代码如下: > db.users.remove() 以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引.数据删除操作是不可恢复的,一旦删除就物理的删除了.对于全集合清除这

  • MongoDB教程之查询操作实例

    1.  基本查询: 构造查询数据.   复制代码 代码如下: > db.test.findOne()     {          "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"),          "name" : "stephen",          "age" : 35,          "genda" : "male&

  • MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码

    MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 下面给大家介绍MongoDB查询文档操作的实例 先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "

  • R语言对Web数据操作实例

    许多网站提供数据供其用户使用. 例如,世界卫生组织(WHO)以CSV,txt和XML文件的形式提供健康和医疗信息的报告. 使用R语言程序,我们可以从这些网站以编程方式提取特定数据. R语言中用于从网站中提取数据的一些包是"RCurl",XML"和"stringr",它们用于连接到URL,识别文件所需的链接并将它们下载到本地环境. 安装R语言的包 处理URL和链接到文件需要以下的包. 如果它们在R语言环境中不可用,您可以使用以下命令安装它们. install

  • python 发送json数据操作实例分析

    本文实例讲述了python 发送json数据操作.分享给大家供大家参考,具体如下: # !/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 import urllib import cookielib import json import httplib import re import requests from lxml import etree import StringIO import time s = request

  • PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解

    本文实例讲述了PHP5.5基于mysqli连接MySQL数据库和读取数据操作.分享给大家供大家参考,具体如下: 在学习1. 开启PHP的API支持 (1)首先修改您的php.ini的配置文件. 查找下面的语句: ;extension=php_mysqli.dll 将其修改为: extension=php_mysqli.dll (2)重新启动Apache/IIS,即可. (3)说明:PHP需要单独的文件来支持这个扩展库,一般在PHP目录下的ext目录里能找到php_mysqli.dll文件(PHP

  • Java学习笔记:基本输入、输出数据操作实例分析

    本文实例讲述了Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 首发时间:2018-03-16 16:30 输出数据: JAVA中在屏幕中打印数据可以使用: System.out.print(x):x可以是一个变量.表达式.字符串. System.out.println(x):x可以是一个变量.表达式.字符串.与print不同的是打印完后会换行 System.out.print

  • asp快速开发方法之数据操作实例代码第1/3页

    这是我自己的心得,给大家作个参考. 我的目的是让开发变得简单,尽可能少地考虑实现语句,更多地把精力用于思考业务逻辑.希望我的文章对大家有所启发和帮助. 如果你对ASP不熟悉,可以先看以下教程: 1.http://布鲁斯狼的ASP编程入门进阶 2.www.w3schools.com的ASP教程(英文\中文),查看更多 好吧,让我们进入正题: 先看以下例子: <% db_path = "database/cnbruce.mdb" Set conn= Server.CreateObje

  • Mongodb数据库的备份与恢复操作实例

    写在前面 本文已经假设你已经安装好了Mongodb(2.6),并且已经开启了auth. 用户 首先我们添加备份和恢复数据所需的用户,这个用户需要有readWrite和userAdmin权限 复制代码 代码如下: $ mongo $ use admin $ db.auth("admin", "youradminpasswd"); $ use backupdb $ db.addUser({ user: "backup", pwd: "pas

  • Python读取JSON数据操作实例解析

    读写 JSON 数据 问题 你想读写 JSON(JavaScript Object Notation) 编码格式的数据. 解决方案 json模块提供给了一种很简单的方式来编码和解码json数据,其中两个主要的函数时json.dumps()和 json.loads() 下面演示如何将一个 Python 数据结构转换为 JSON: import json data = { 'name' : 'ACME', 'shares' : 100, 'price' : 542.23 }json_str = js

随机推荐