资讯专栏INFORMATION COLUMN

mongo出识以及对数组的操作

jk_v1 / 518人阅读

摘要:热身完毕,数组时间到。为只返回的键值对还是要加双引号哦不等于类似于操作查看版本查看当前机器连接地址如如果你想创建一个的数据库,先运行命令,之后就做一些操作如这样就可以创建一个名叫的数据库。

如果你还没有安装,可以参考下这个文章,mondodb基本安装和curd

首先推荐个工具,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({})

其他基本命令从这里找

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18796.html

相关文章

  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    Simon_Zhou 评论0 收藏0
  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    dockerclub 评论0 收藏0
  • Express 实战(八):利用 MongoDB 进行数据持久化

    摘要:在使用过程中我们可以通过增加哈希次数来提高数据的安全性。当然,对密码的哈希操作应该在保存数据之前。 showImg(https://segmentfault.com/img/remote/1460000010821081); 毫无疑问,几乎所有的应用都会涉及到数据存储。但是 Express 框架本身只能通过程序变量来保存数据,它并不提供数据持久化功能。而仅仅通过内存来保存数据是无法应对...

    yanbingyun1990 评论0 收藏0
  • mongodb学习笔记

    摘要:我们常说的分表分库分区等概念都属于分片的实际体现。传统分片做法是手工分表分库。自动分片技术是根据指定的片键自动拆分数据并维护数据请求路由的过程。 1.mongodb特性 1)mongo是一个面向文档的数据库,它集合了nosql和sql数据库两方面的特性。 2)所有实体都是在首次使用时创建。 3)没有严格的事务特性,但是它保证任何一次数据变更都是原子性的。 4)也没有固定的数据模型 5)...

    王晗 评论0 收藏0

发表评论

0条评论

jk_v1

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<