https://segmentfault.com/a/1190000003951602

首先推荐个工具,no-sql-manager-for-mongodb-professional,虽然收费,但是每个月可以重新注册。无限次使用下载

插入两条数据

use demo
db.demo.insert({name:2})
db.demo.insert({name:3})

更新name为4不存在的数据,对数据没有任何影响
db.demo.update({name:4},{age:4})

update第三个参数加true表示对更新不存在数据时候自动添加这条数据,但是下面的语句是把name干掉了,只剩下age字段,因为没有$set操作符

db.demo.update({name:3},{age:3},true)

请自己比较下面两区别
db.demo.update({name:99},{$set:{age:213}},true)
db.demo.update({name:99},{age:213},true)

现在数据如下

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3 }

让3岁孩子上小学
db.demo.update({age:3},{$set:{school:1}})

这样age=3的其中一个就有学上了

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }

但是想要所有的3岁孩子上小学,需要第四个参数为true第三个参数false代表如果不存在,不必插入新的数据,另外因为第四个参数是true,代表批量更新

db.demo.update({age:3},{$set:{school:1}},false,true)

复习:请自己比较以下两条代码

db.demo.update({age:3},{$set:{school:1}},false,true)
db.demo.update({age:4},{$set:{school:2}},true,true)

我们在加一个四岁的孩子,直接给他学上,即使没有四岁的孩子也要造一个让他上小学二年级,因为第三个参数是true

db.demo.update({age:4},{$set:{school:2}},true,true)

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3, "school" : 1 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }
{ "_id" : ObjectId("561f8b066adf558520f65efd"), "age" : 4, "school" : 2 }

四岁孩子自己长大了,长大了一岁,$inc,对字段递增

db.demo.update({age:4},{$inc:{age:1}},true,true)

学校也要长大一级,上3年级了,想蹦极就直接school:2

db.demo.update({age:5},{$inc:{school:1}})

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3, "school" : 1 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }
{ "_id" : ObjectId("561f8b066adf558520f65efd"), "age" : 5, "school" : 3 }

删除一些没用的属性 $unset,自己测试-1和1都行。
db.demo.update({name:99},{$unset:{age:-1}})


热身完毕,数组时间到。这是mongo的独特之处哦
添加个id为5的人,名字为5,给他个喜欢的空书单

db.demo.insert({_id:5,name:5,books:[]})

db.demo.find()
{ "_id" : 5, "name" : 5, "books" : [ ] }

增加一个或者多个元素,给他本myaql看

db.demo.update({_id:5},{$push:{books:"php,mysql"}})

在来一个爱好,反正不要钱

db.demo.update({_id:5},{$push:{habbit:"song,girl,box"}})

{ "_id" : 5,
"name" : 5, 
"books" : [ "php,mysql"],
"habbit" : [ "song,movie,girl"]
}

想往数组添加又怕重复,就用$addToSet

db.demo.update({_id:5},{$addToSet:{books:"js,sql"}})

不管上面执行多少次,结果都是

{ "_id" : 5, "name" : 5, "books" : [ "php,mysql", "js,sql" ] }

我想一条语句批量向books添加(node.js,mongo,redis),就这样

db.demo.update({_id:5},{$addToSet:{books:{$each:["node.js",'mongo','redis']}}})

删除一条记录remove
db.demo.remove({_id:5})

我们看数组中的删除操作:假如现在结果这样,我们来试试删除数组元素
{ "_id" : 5, "books" : [ "js", "js,sql", "mongo", "java" ] }

-1代表第一个元素,1代表最后一个元素,自己动手敲吧,孰能生气袄~

db.demo.update({_id:5},{$pop:{books:-1}})
db.demo.update({_id:5},{$pop:{books:1}})
db.demo.update({_id:5},{$pull:{books:"PHP"}})// 用pull 删除指定一个元素
db.demo.update({_id:5},{$pullAll:{books:["js,sql","mongo"]}})// pullAll删除多个元素,注意参数为数组

获取最后错误(执行情况)
db.runCommand({getLastError:1})

用find的第二个参数返回只想要的字段,只是查询name字段,0为相反(剔除某个字段,_id也同样试用)
db.demo.find({},{name:1)}
查询条件 $lt,$lte,$gt,$gte,$ne,$ne,$in,$nin,$or,$mod,$not,
查找复合特定要求
db.demo.find({name:"u_2"})

创建一个不存在数组字段,默认为空
db.demo.update({name:"u_2"},{$set:{'books':[]}},true)

WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("563abcde3d94d7df4f645c92")
}) db.demo.find({name:'u_2'})
{ "_id" : ObjectId("563abcde3d94d7df4f645c92"), "name" : "u_2", "books" : [ ] }

向books数组里里添加元素 php
db.demo.update({name:"u_2"},{$addToSet:{books:"php"}})

向books批量添加元素而且不会重复添加
db.demo.update({name:"u_2"},{$addToSet:{books:{$each:["node","python","php"]}}})

在数组中添加一个元素可以在加一个重复的php,这样里面就有两个php了

db.demo.update({name:"u_2"},{$push:{books:"php"}})

创建一个不存在的数组,而且给他自定义初始值
db.demo.update({name:"u_2"},{$addToSet:{todo:{$each:["l","m","n"]}}})

删除todo数组中的尾部 n
db.demo.update({name:"u_2"},{$pop:{todo:1}})

删除todo数组中的头部 l,现在就todo里就剩下n了
db.demo.update({name:"u_2"},{$pop:{todo:-1}})

再加些数据,用push和each可以批量添加而且可以重复,现在todo里是有m,l,m,n四个字段
db.demo.update({name:"u_2"},{$push:{todo:{$each:["l","m","n"]}}})

删除指定的数组某个元素,我们就删除最后一个,为n的,现在剩下了mlm三个

db.demo.update({name:"u_2"},{$pull:{todo:"n"}})

更新todo里m的值,为mm,只是更新了第一条匹配到的

db.demo.update({name:"u_2",todo:"m"},{"$set":{"todo.$":"mm"}})

这种也可以,注意要加双引号

db.demo.update({name:"u_2"},{$set:{"todo.1":"www"}})

数组的其他查找 $all,$size,


我们在来一条新的记录,创建一条新的记录_id为6:

db.demo.insert({_id:6,name:'tb',books:[{type:"js",name:"extjs4.0",author:"tom"},{type:"db",name:"mongo"}]})

再更新下,多加一条

db.demo.update({_id:6},{$set:{books:[{type:"js",name:"extjs4.0",author:"tom"},{type:"db",name:"mongo"},{type:"js",name:"jquery"}]}})

db.demo.find({_id:6}).pretty()
{
"_id" : 6,
"name" : "tb",
"books" : [
{
"type" : "js",
"name" : "extjs4.0",
"author" : "tom"
},
{
"type" : "db",
"name" : "mongo"
},
{
"type" : "js",
"name" : "jquery"
}
]
}

为type是js的books元素添加pens:"too long"属性,使用.符号一定使用双引号引用,用$占位

db.demo.update({"books.type":"js"},{$set:{"books.$.pens":"too long"}})//增加数组内集合一个新元素,如果"books.type"没有加双引号,会报语法.号错误
{ "_id" : 6, "name":"tb",books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tom", "pens" : "too long" }, { "type" : "db", "name" : "mongo" }, { "type" : "js", "name" : "jquery" } ] }

db.demo.update({"books.type":"js"},{$set:{"books.$.author":"tb"}})//更改数据内一个集合新元素,把book里type为js的author改为tb

{ "_id" : 6, "name":"tb","books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tb", "pens" : "too long" }, { "type" : "db", "name" : "mongo" }, { "type" : "js", "name" : "jquery" } ] }


其他的小操作:

db.demo.find({},{books:0)// 返回除去books以外的所有键值对。1为只返回books的键值对
db.demo.find({age:{"$gte":30,"$lte":40}})//还是要加双引号哦
db.demo.find({"age":{"$ne":1}})// 不等于$ne
db.demo.find({"age":{"$in":[30,2,3,4,5,69]}})//类似于mysql in操作
db.demo.find({"age":{"$in":[1,2,3,4,5,6]}}).forEach(function(doc){
printjson(doc)
})

db.version() 查看版本
db.getMongo () 查看当前机器连接地址
如:如果你想创建一个“myTest”的数据库,先运行
use myTest
命令,之后就做一些操作(如:
db.createCollection('user')
,这样就可以创建一个名叫“myTest”的数据库。
从指定主机上克隆数据库

db.cloneDatabase("127.0.0.1"); 将指定机器上的数据库的数据克隆到当前数据库

从指定的机器上复制指定数据库数据到某个数据库

db.copyDatabase("mydb", "temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中

修复当前数据库

db.repairDatabase();
删除所有
db.demo.remove({})

其他基本命令从这里找

http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html

# count_info = to_list(countfile,col=(0,1))

# for gid,count in count_info:
# db["gene_ontology"].update({"_id":gid},
# {"$set":{"count.{}".format(collection):int(count)}}, # use dot operation
# )

segmentfault.com mongo出识以及对数组的操作的更多相关文章

  1. c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

    //题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...

  2. C语言程序,找出一个二维数组的鞍点。

    什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...

  3. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  4. PHP数组的操作

    一.数组操作的基本函数数组的键名和值array_values($arr);获得数组的值array_keys($arr);获得数组的键名array_flip($arr);数组中的值与键名互换(如果有重复 ...

  5. js数组的操作及数组与字符串的相互转化

    数组与字符串的相互转化 <script type="text/javascript">var obj="new1abcdefg".replace(/ ...

  6. Js数组的操作push,pop,shift,unshift等方法详细介绍

    js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首 先来讲一下push和pop方法,这两个方法只会对数组从尾 ...

  7. java基础之数组常用操作

    常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public cla ...

  8. 微信小程序setData()方法的详解以及对数组/json操作

    此篇文章是本人对setData方法的一些理解,是查阅文档和查找一些其他资料综述的,有所不足希望指正! 直接进入正题! 一.setData()方法: 1.参数接受一个对象,以key,value的形式表示 ...

  9. Scala学习(三)----数组相关操作

    数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...

随机推荐

  1. Common Issues Which Cause Roles to Recycle

    This section lists some of the common causes of deployment problems, and offers troubleshooting tips ...

  2. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

  3. C# Gabbage Collecting System

    * 这个程序非常巧妙的探测了一下垃圾回收机制,发现如下结论: * 当内存紧急时,才会启动垃圾回收GC.Collect() * 从此程序的运行上来看,delete是连续出现的,这体现了垃圾回收的强度. ...

  4. jQuery插件---exselect实现联动

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  5. XML的总结学习

    XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. HTML 被设计用来显示数据.  (一切都是为了数据:采集.整理.存储.传输.显 ...

  6. iSCSI 与 ceph

    SCSI  小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘.软驱.光驱.打印机.扫描仪等)系统级接口的独立处理器标 ...

  7. android请求root权限

    应用获取Root权限的原理:让应用的代码执行目录获取最高权限.在Linux中通过chmod 777 [代码执行目录] //请求root权限    public static boolean upgra ...

  8. [转]Java_List元素的遍历和删除

    原文地址:http://blog.csdn.net/insistgogo/article/details/19619645 1.创建一个ArrayList List<Integer> li ...

  9. Struts2总结

    1.构建Struts2的开发环境? 1.1:导入相应jar包(最简化的,后期可以直接复制). 1.2:编写struts.xml配置文件.(从实例中提供参考). <package name=&qu ...

  10. 【BZOJ 4269】再见Xor

    zky学长提供的线性基求法: for(int i=1;i<=n;i++) for(int j=64;j>=1;j--) { if(a[i]>>(j-1)&1) { if ...