segmentfault.com mongo出识以及对数组的操作
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']}}})
删除一条记录removedb.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数组里里添加元素 phpdb.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数组中的尾部 ndb.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出识以及对数组的操作的更多相关文章
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- C语言程序,找出一个二维数组的鞍点。
什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- PHP数组的操作
一.数组操作的基本函数数组的键名和值array_values($arr);获得数组的值array_keys($arr);获得数组的键名array_flip($arr);数组中的值与键名互换(如果有重复 ...
- js数组的操作及数组与字符串的相互转化
数组与字符串的相互转化 <script type="text/javascript">var obj="new1abcdefg".replace(/ ...
- Js数组的操作push,pop,shift,unshift等方法详细介绍
js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首 先来讲一下push和pop方法,这两个方法只会对数组从尾 ...
- java基础之数组常用操作
常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public cla ...
- 微信小程序setData()方法的详解以及对数组/json操作
此篇文章是本人对setData方法的一些理解,是查阅文档和查找一些其他资料综述的,有所不足希望指正! 直接进入正题! 一.setData()方法: 1.参数接受一个对象,以key,value的形式表示 ...
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
随机推荐
- Web Audio API 实现音频可视化
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio A ...
- AVL树插入操作实现
为了提高二插排序树的性能,规定树中的每个节点的左子树和右子树高度差的绝对值不能大于1.为了满足上面的要求需要在插入完成后对树进行调整.下面介绍各个调整方式. 右单旋转 如下图所示,节点A的平衡因子(左 ...
- SQL复杂查询和视图(2)
分组查询 SQL可以将检索到的元组按某一条件进行分组,分组是属性值相同的为一组 求每个学生的平均成绩 SELECT sn,AVG(score)FROM scGROUP BY sn 先按sn进行分组,即 ...
- golang: 把sql结果集以json格式输出
func getJSON(sqlString string) (string, error) { stmt, err := db.Prepare(sqlString) if err != nil { ...
- “Ceph浅析”系列之五——Ceph的工作原理及流程
本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...
- Android NestedScrolling与分发机制
在Android5.0之间要实现控件的嵌套滑动,都是要自己处理View事件即分发机制. 共有三个方法: dispatchTouchEvent().onInterceptTouchEvent()和 ...
- Activity has leaked window that was originally added -界面退出时未关闭对话框异常 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? -
退出Activity时弹出登录框,点击确定finish当前Activity,结果报了这个错,随后查找资料知道 原因: 是因为退出Activity时没有关闭弹出框,出现了这个错误 解决方法: 只需要在a ...
- 概率DP light oj 1030
t组数据 n块黄金 到这里就捡起来 出发点1 到n结束 点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6 如果满6个的话 否则 ...
- html-div自动撑大
下面提供几种解决方案,以修复该问题. 1.给父容器使用display属性 div#container { display: table; /* 建议使用 */ /*或者 display: table- ...
- OPENGGL深度测试
深度测试是为了解决那些在绘图过程中本应该被隐藏的面结果却出现了,例如: 绘图代码中先绘制了一个一个近处的立方体,后绘制了一个远处的立方体,结果在绘制过程中,远处的立方体总是在近处的立方体后绘制,所以在 ...