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. 为Visual Studio更换皮肤和背景图

    最近在博客上别人在老早之前就有加了背景图,想想怎么能这么out,于是乎,百度一下,能否知道? 咳咳,资源还是有滴!可惜都是比较旧的跟新版本的配置方法可能有点不一样, 可能会有很多人会觉得不适应,不过没 ...

  2. Java Little Knowledge

    1.Constructor running order of Base class and Derived class This is Alibaba's audition problem. clas ...

  3. 使用Git时一些问题的处理

    更新日志: 2016.06.04 晚 添加 git push --force (用于删除高版本的commit) 2015.11.29 晚 添加冲突处理工具Meld的教程 添加在GitHub上Rever ...

  4. Java--笔记(2)

    11.根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件: 1)互斥条件(Mutual ...

  5. IntelliJ_13书签

    一.书签视图   二.使用方法 1.添加书签:Ctrl+Shift+数字 2.跳转到书签:Ctrl+数字 来自为知笔记(Wiz)

  6. 写chrome插件---一个优酷自动加粉丝助手

    写chrome插件主要就是写js , 我们要构造界面(HTML), 以及样式(CSS),  以及chrome给我们提供的jsAPI, 主要是chrome的API, 调试的话可以使用chrome的开发者 ...

  7. 平行四边形面积 light 1305

    double 不一定是与x y轴平平行 所以要正弦定理和余弦定理 似乎一定要printf输出 错了好几次 #include<iostream> #include<math.h> ...

  8. eclipse-debug时直接进入/不进入/提示进入调试页面修改

    eclipse使用debug调试程序时 默认设置每次程序走到断点位置时提示是否进入调试页面(如图) 而个人习惯有些系统直接进入调试页面.也有些人系统不进入调试页面调试 在这里勾选Remember my ...

  9. java基础2.0:Object、Class、克隆、异常编程

    Java编程中两个重要的类Object 和 Class及java异常编程 (1)是所有Java类(API提供的类.自定义类)的最终父类. (2)作用:在JVM管理对象中的过程中,有一套统一的类型检查和 ...

  10. XAML: x:DeferLoadStrategy, x:Null

    x:DeferLoadStrategy="Lazy" - 用于指定一个 UIElement 为一个延迟加载元素 x:Null - null 示例1.x:DeferLoadStrat ...