MongoDB创建\更新\删除文档操作
一、插入\创建文档
--当插入一个不存在的文档时,会自己主动创建一个文档
[root@racdb ~]# mongo
MongoDB shell version: 2.4.14
connecting to: test
> show collections
> db.cols.insert({bar:"baz"})
> db.cols.find()
{ "_id" :ObjectId("56aac1df4e61b6d9f84d17e0"), "bar" :"baz" }
二、删除文档
--删除全部文档
> db.cols.remove()
--删除符合条件的文档
> db.cols.remove({bar:"baz"})
注意:db.cols.remove()不会删除cols集合本身,原有索引也会保留
三、更新文档
文档替换
--假设把以下文档
>db.users.findOne({"name":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"name" : "licz",
"friends" : 43,
"enemies" : 5
}
--更新成以下文档
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz"
}
更新方法:
> licz.relationships ={"friends":licz.friends,"enemies":licz.enemies}
{ "friends" : 43,"enemies" : 5 }
> licz.username = licz.name
licz
> delete licz.friends
true
> delete licz.enemies
true
> delete licz.name
true
>db.users.findOne({"name":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"name" : "licz",
"friends" : 43,
"enemies" : 5
}
>db.users.update({name:"licz"},licz)
>db.users.findOne({"username":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz"
}
使用改动器
1. $set
$set用来改动指定键的值,假设键不存在,就创建它。
>db.users.findOne({"name":"haley"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"name" : "haley",
"age" : 30,
"sex" : "male"
}
--增加文档的键值对
> db.users.update({"name":"haley"},{"$set":{"location":"china"}})
> db.users.update({"name":"haley"},{"$set":{"favoritebook":"war and peace"}})
>db.users.findOne({"name":"haley"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"name" : "haley",
"age" : 30,
"sex" : "male",
"location" : "china",
"favorite book" : "war and peace"
}
--改动"favoritebook"键的值
> db.users.update({"name":"haley"},{"$set":{"favoritebook":"green eggs and ham"}})
>db.users.findOne({"name":"haley"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"name" : "haley",
"age" : 30,
"sex" : "male",
"location" : "china",
"favorite book" : "green eggs and ham"
}
2. $inc
$inc用来增加/降低文档中键的值,相同假设键不存在,就创建它
>db.analytics.findOne({"url":"www.example.com"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"url" : "www.example.com",
"pageviews" : 54
}
>db.analytics.update({"url":"www.example.com"},{"$inc":{"pageviews":1}})
>db.analytics.findOne({"url":"www.example.com"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"url" : "www.example.com",
"pageviews" : 55
}
--增加"visits"键值对
>db.analytics.update({"url":"www.example.com"},{"$inc":{"visits":3}})
>db.analytics.findOne({"url":"www.example.com"})
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"url" : "www.example.com",
"pageviews" : 55,
"visits" : 3
}
注意:能够看$set和$inc改动器的差别:
$set是改动字符型的键值,$inc是改动数值型的键值;都是在不存在键时会自己主动增加上。
数据组改动器
3. $push
$push作用:假设指定的键存在,$push会向已有数组末尾增加一个元素,要是没有就会创建一个新的数据。
>db.blog.posts.findOne({"title":"A Oracle error summary"})
{
"_id" :ObjectId("56aad2744e61b6d9f84d17e1"),
"title" : "A Oracle error summary",
"content" : "..."
}
> db.blog.posts.update({"title":"AOracle error summary"},
...{"$push":{"comments":{"name":"licz","email":"licz@163.com","content":"goodpost!"}}})
>db.blog.posts.findOne({"title":"A Oracle error summary"})
{
"_id" : ObjectId("56aad2744e61b6d9f84d17e1"),
"title" : "A Oracle error summary",
"content" :"...",
"comments" : [
{
"name" :"licz",
"email" :"licz@163.com",
"content" :"good post!"
}
]
}
--再次加一个数据元素
... {"$push":{"comments":{"name":"haley","email":"haley@qq.com","content":"thankyou post"}}})
>db.blog.posts.findOne({"title":"A Oracle error summary"})
{
"_id" : ObjectId("56aad2744e61b6d9f84d17e1"),
"title" : "A Oracle error summary",
"content" : "...",
"comments" : [
{
"name" :"licz",
"email" :"licz@163.com",
"content" :"good post!"
},
{
"name" :"haley",
"email" :"haley@qq.com",
"content" :"thank you post"
}
]
}
4. $ne
$ne能够对键做一些推断,如:使用$ne和$push组,假设一个值不在数组里面就把他加进去,避免插入反复值
> db.papers.findOne()
{
"_id" : ObjectId("56aadaaa4e61b6d9f84d17e2"),
"title" : "People life",
"content" : "..."
}
>db.papers.update({"authorscited":{"$ne":"Richie"}},
...{"$push":{"authorscited":"Richie"}})
> db.papers.findOne()
{
"_id" : ObjectId("56aadaaa4e61b6d9f84d17e2"),
"title" : "People life",
"content" : "...",
"authors cited" : [
"Richie"
]
}
--再次增加相同元素,文档没有变化
> db.papers.update({"authorscited":{"$ne":"Richie"}},
...{"$push":{"authorscited":"Richie"}})
> db.papers.findOne()
{
"_id" : ObjectId("56aadaaa4e61b6d9f84d17e2"),
"title" : "People life",
"content" : "...",
"authors cited" : [
"Richie"
]
}
5. $addToSet
$addToSet作用:能够取代$ne和$push组全,在数组里增加一个元素且能增加多个元素,也能避免插入反复值
>db.users.findOne({"username":"licz"}
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz"
}
> db.users.update({"username":"licz"},{"$addToSet":{"email":"licz@163.com"}})
>db.users.findOne({"username":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz",
"email" : [
"licz@163.com"
]
}
--再运行增加数组元素
> db.users.update({"username":"licz"},{"$addToSet":{"email":"licz@qq.com"}})
> db.users.findOne({"username":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz",
"email" : [
"licz@163.com",
"licz@qq.com"
]
}
6. $each
$addToSet和$each组合,能够为数组增加多个不同的值
> db.users.update({"username":"licz"},
...{"$addToSet":{"email":{"$each":["licz@umessage.com","licz@sina.com"]}}})
>db.users.findOne({"username":"licz"})
{
"_id" : ObjectId("56a8828b308203e00e436b01"),
"relationships" : {
"friends" : 43,
"enemies" : 5
},
"username" : "licz",
"email" : [
"licz@163.com",
"licz@qq.com",
"licz@umessage.com",
"licz@sina.com"
]
}
7. $pop
$pop改动器能够从数组不论什么一端删除元素。
{$pop:{key:1}}从末尾端删除元素
{$pop:{key:-1}}从开头端删除元素
8. $pull
$pull能够基于特定条件来删除数组元素,而不仅仅是根据位置
>db.lists.insert({"todo":["dishs","laundry","drycleaning"]})
> db.lists.update({},{"$pull":{"todo":"laundry"}})
> db.lists.findOne()
{
"_id" : ObjectId("56aafd4a4e61b6d9f84d17e3"),
"todo" : [
"dishs",
"dry cleaning"
]
}
$pull会将全部匹配的部分删掉。对数组[1,1,2,1]运行pull 1,得到的结果是仅仅有一个元素[2]
数组的定位改动器
有两种方法操作数组中的值:通过位置和定位操作符$
数组都是以0开头的,能够直接用下标直接作为键来选择元素。例如以下
>db.blog.posts.findOne({"title" : "A blog post"})
{
"_id" : ObjectId("4b2d75476cc613d5ee930164"),
"title" : "A blog post",
"content" : "...",
"comments" : [
{
"name" :"joe",
"email" :"joe@example.com",
"content" :"nice post."
},
{
"name" :"bob",
"email" :"bob@example.com",
"content" :"good post."
}
]
}
>db.blog.posts.update({"title" : "A blogpost"},{"$inc":{"comments.0.visits" : 1}})
>db.blog.posts.findOne({"title" : "A blog post"})
{
"_id" : ObjectId("4b2d75476cc613d5ee930164"),
"title" : "A blog post",
"content" : "...",
"comments" : [
{
"name" :"joe",
"email" :"joe@example.com",
"content" :"nice post.",
"visits" : 1
},
{
"name" :"bob",
"email" :"bob@example.com",
"content" : "goodpost."
}
]
}
但非常多情况我们不知道要改动数组下标是多少,这时就能够使用定位操作符$,用来定位查询文档已经匹配的元素,并进行更新。
>db.blog.posts.update({"comments.name":"bob"},{"$set":{"comments.$.name":"licz"}})
>db.blog.posts.findOne({"title" : "A blog post"})
{
"_id" : ObjectId("4b2d75476cc613d5ee930164"),
"title" : "A blog post",
"content" : "...",
"comments" : [
{
"name" :"joe",
"email" :"joe@example.com",
"content" :"nice post.",
"visits" : 1
},
{
"name" :"licz",
"email" :"bob@example.com",
"content" :"good post."
}
]
}
upsert更新方法
upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件创建一个新文档,假设匹配就更新。
事实上就是update的第三參数。默认就是false.
> db.analytics.find()
{ "_id" :ObjectId("56a88706308203e00e436b04"), "url" :"www.baidu.com", "pageview" : 2, "visits" : 3 }
> db.analytics.update({"url":"www.csdn.net"},{"$inc":{"visits": 1}},true)
> db.analytics.find()
{ "_id" :ObjectId("56a88706308203e00e436b04"), "url" :"www.baidu.com", "pageview" : 2, "visits" : 3 }
{ "_id" :ObjectId("56ab094c638a1346c373d5d9"), "url" :"www.csdn.net", "visits" : 1 }
save 函数
save是一个shell函数,能够文档不存在时插入,存在时更新。它仅仅有一个參数:文档
使用例如以下:
> var x=db.foo.findOne()
> x.sum = 50
50
> db.foo.save(x)
> db.foo.find()
{ "_id" :ObjectId("56a88f55308203e00e436b07"), "count" :"1", "num" : 42, "sum" : 50 }
更新很多其它的文档
默认情况下,更新仅仅能对条件的第一个文档运行操作。
要使用全部文档都得到更新,能够设置update的第4个參数为ture,默认是false
比如:
给全部特定日期过生日的用户发一份礼物,就可使用多文档更新。将gift增加到他们的账号.
>db.users.update({"birthday":"1988/11/1"},{"$set":{gift:"Happybirthday!"}},false,true)
--查看更新了多少文档。n就是这个值
> db.runCommand({getLastError : 1})
{
"connectionId" : 13,
"n" : 3,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
}
MongoDB创建\更新\删除文档操作的更多相关文章
- 《mongoDB》基本操作-创建/更新/删除文档
一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo - use db_name; 选择你要操作的集合 > use demo switched to db dem ...
- MongoDB(二)创建更新删除文档
插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz" ...
- 2.MongoDB系列之创建更新删除文档
1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('b ...
- MongoDB改动、删除文档的域属性实例
MongoDB改动.删除文档的域属性实例 在站点的开发中,可能最初的设计不合理.或者后期业务的变更,会造成文档结构会有些无用的属性.须要去删除或改动.因为MongoDB 是无 Schema 的,不像关 ...
- es之java删除文档操作
删除文档操作 @Test public void deleteDocument(){ DeleteResponse response = client.prepareDelete("twit ...
- MongoDB系列---集合与文档操作03
MongoDB-——Collection 学习大纲: 1.集合操作 2.文档操作 知识回顾: 上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障. 一 ...
- mongodb学习之:文档操作
在上一章中有讲到文档的插入操作是用insert的方法.如果该集合不在该数据库中,mongodb会自动创建该集合并插入文档 用find的方法可以查找所有的集合数据 > db.maple.find( ...
- sharepoint中的Power Shell命令创建、删除文档库列表
ListTemplateType 枚举: 自定义列表-GenericList.文档库-DocumentLibrary.图片库-PictureLibrary.公告-Announcements.联系人-C ...
- ElasticSearch 7.3.0 查询、修改、删除 文档操作
PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...
随机推荐
- ASP.Net Cookie总结
Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...
- Python的递归深度
RuntimeError: maximum recursion depth exceeded while calling a Python object 大意是调用 Python 对象时超出最大深度限 ...
- 路由器一键桥接Android实现
開始之前,首先说一下什么叫一键桥接,所谓一键桥接,就是点击一下.就能够对所连接的路由器进行网络中继设置.以实现路由器能够通过已有的无线路由器进行网络訪问. 那么实现这个功能有几种方法呢?能够说有非常多 ...
- Threejs 官网 - 怎样执行本地的东西(How to run things locally)
Threejs 官网 - 怎样执行本地的东西(How to run things locally) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循&qu ...
- 【opencv】opencv在vs下的配置(持续更新)
经常使用配置记录,会更新下去. 1.去掉ipch及.sdf文件 opencv在vs编译会得到很多文件.当中.dsf和ipch文件就有几十M.总是非常占空间,而这都是用来保存C++预编译的头文件和Int ...
- c6----函数的声明和实现
// // main.c // 函数的声明和定义 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All r ...
- pcap文件生成metadata——使用tshark解析tcpdump的pcap包
pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...
- 几种AutoLayout自动布局所经常使用的布局约束类型
width表示约束ui控件的固定宽度 height表示约束ui控件的固定高度 Leading Space to Superview 与父视图的左边界线保持固定距离 Trailing Space to ...
- ORM框架——Dapper的应用
常见的ORM框架有EF,Dapper,NHibernate 参考:http://shuai7boy.iteye.com/blog/2357339 http://www.cnblogs.com/Sint ...
- Python 接口类或抽象类 反射
# 抽象类或者接口类,制定规范,统一方法名 # # 抽象类或者接口类,制定规范,统一方法名 from abc import ABCMeta,abstractmethod class Payrole(m ...