问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mongodb内嵌文档更新怎么做

发布网友 发布时间:2022-04-29 22:10

我来回答

2个回答

懂视网 时间:2022-04-30 02:31

createCollection()

<span style="font-size:14px;">name:创建的集合名称
options:是一个作为初始化的文档(可选)</span>

<span style="font-size:14px;">> db.createCollection("jingdong")  #无参数
{ "ok" : 1 }
> show collections
jingdong
system.indexes
> db.createCollection("jingdong", { capped : 1, autoIndexID : 1, size : 6142800, max : 10000 } )  #带参数
{ "ok ": 1 }</span>

capped:类型为Boolean,如果为ture则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为ture时也要指定参数大小;
autoIndexID:类型为Boolean,默认为false,如果设置为ture,则会在_id field.s上自动创建索引;
size:如果capped为ture需要指定,指定参数的最大值,单位为byte;
max:指定最大的文档数。 在mogodb中也可以不用创建集合,因为在创建文档的时候也会自动的创建集合

删除集合 

db.COLLECTION.drop()

<span style="font-size:14px;">> use JD
switched to db JD
> show collections
jingdong
jingdong1
system.indexes
> db.jingdong.drop()
ture
> show collections
jingdong1
system.indexes</span>

插入文档 

db.COLLECTION_NAME.insert(document)


</pre><pre name="code" class="python"><span style="font-size:14px;">> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":" test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] }) 
> userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":" test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] }) 
> doc=({"name":"peter","position":"teacher"}) #先定义文档
> use JD
switched to db JD
> db.jingdong.insert(userdoc1)
WriteResult({"nInserted":1})
> db.jingdong.insert(userdoc2)
WriteResult({"nInserted":1})
> db.jingdong.insert(doc1)
WriteResult({"nInserted":1})</span>

更新文档

 db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA)

<span style="font-size:14px;">#将user_id=2的文档的e-mail改为group@qq.com  
> db.jingdong.update({"user_id":"02","e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
#第一个大括号内容标示查找条件,第二个大括号内容则表示更新后的数据
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
> db.jingdong.find()</span>

<pre name="code" class="python"><span style="font-size:14px;">默认的update函数只对一个文档更新,如果想作用所有文档,则需要加入multi:ture</span>

<span style="font-size:14px;">db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:ture})</span>

替换已存在的文档 

db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})


<span style="font-size:14px;">> db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4","name":"Bob","position":"techer")})
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})</span>

删除文档 

db.COLLECTION_NAME.remove(DELECTION_CRITERIA)

<span style="font-size:14px;">> db.shiyanlou.remove({"name":"Bob"})
WriteResult({"nRemoved":1})</span>

之后可以使用find()查看所有的文档,验证使得删除成功。

createCollection():创建集合

db.COLLECTION.drop():删除集合

db.COLLECTION_NAME.insert(document):插入文档

db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA):更新文档

db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}):替换已存在的文档

db.COLLECTION_NAME.remove(DELECTION_CRITERIA):删除文档



MongoDB数据库更新和删除文档

标签:mongodb   数据库   索引   数据   

热心网友 时间:2022-04-29 23:39

创建文档

向MongoDB插入数据,使用insert,

如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})

这个操作会给 文档 增加 一个"_id",键,并保存在数据库中。

批量插入

如果要插入多个文档,使用批量插入会快一些,批量化插入能传入一个有文档构成的数据给数据库

一次批量插入只是单个的TCP请求,避免了许多零碎的请求带来的开销.由于无需处理大量的消息头,

这样能减少插入时间.每当单个文档发送致数据库时,会有一个头部信息,告诉数据库对指定的集合做

插入操作.用批量插入的话,数据库就不用重复的处理每个文档的这种头部信息了.

当前版本MongoDB消息的最大长度是16M,使用批量插入是有这个*的.

插入的原理和作用

当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库.数据库解析

BSON,检验是否包含"_id"键并且不超过16M,除此之外,不做别的验证,就只是简单的将文档原样的

存入数据库.这样做的坏处是允许插入无效的数据,好处是能让数据库更加安全,远离注入式攻击.

所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,

是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入

之前先检验文档结构的有效性,当然这样要牺牲性能.

查看doc文档转化为BSON的大小(以字节为单位),在shell中使用Object.bsonsize(doc)

删除文档

db.users.remove()

会删除users集合的所有文档,但不会删除集合本身,原有的索引也会保留.

remove函数可以接受一个查询文档作为可选参数,给定这个参数,只有符合条件的文档才会被删除.

db.users.remove({"name":"Refactor"})

删除数据的永久性的,不能撤销和恢复.

如果要清除整个集合,直接删除集合(然后重建索引)比删除集合中所有的文档要快.

删除集合:db.drop_collection("users")

更新文档

update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档进行那些更改

更新的操作是原子性的,若两个更新同时发生,先到服务器的先执行,然后执行另一个.最后的更新会显示在数据库

文档替换

更新最简单的就是使用一个新文档来替代匹配的文档,这适用于模式结构发生较大变化的时候.如将下面的文档

{
  "name":"refactor",
  "friends":20,
  enemies:2
}

更改为

{
  "name":"refactor",
  "relationships":
  {
    "friends":20,
    enemies:2
  }
}

使用修改器

通常文档只会有一部分更新,利用原子的"更新修改器",更新修改器是特殊的键,用来指定复杂的更新操作,比如:

调整,增加,删除键,操作数组,操作内嵌文档.

一般网站都有计数器,来记数公有多少人访问,可以使用原子修改器原子性的完成整个功能.如:

"$set"修改器入门

"$set"用来指定一个键的值,如果键不存在,则创建,这对更新模式或者增加用户定义键来说很方便.

如:
db.users.insert(
  {
    "name":"refactor",
    "age":23,
    "sex":"male"
  }
)
添加喜欢的书籍:
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace"}
  }
)
db.users.findOne(
  {"name":"refactor"}
 )
修改喜欢的数据
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace2"}
  }
)
"$set"可以修改键的数据类型,如果喜欢多本书,
将book键的值变为一个数组
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":["war and peace","war and peace2"]}
  }
)
使用"$unset"将键删除,没有要删除的键也不报错
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$unset":{"book":1}
  }
)
使用"$set"修改内嵌文档
db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

db.blog.update(
  {
    "author.name":"refactor"
  },
  {
    "$set":{"author.name":"refactor2"}
  }
)
db.blog.findOne(
  {
    "title":"refactor's blog"
  }
)
增加,修改,删除键的时候,应该使用$修改器.一定要使用$开头的修改器来修改键值对.

使用"$inc" 增加和减少

"$inc"用来增加已有键的值,若不存在键,则增加.用于分析数据,因果关系,投票或其他有变化值的地方.

如:

db.users.insert(
  {"url":"http://www.cnblogs.com/refactor"}
)

使用"$inc" 增加一个键pageViews,默认值为10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再增加10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再减少10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":-10000}}
)

"$inc"和"$set"用法相似,用来增加或减少数字."$inc"只能用于整数,长整数或双精度浮点数.

虽然很多语言能将 null,bool,有数字构成的字符串 转化成 数字,但使用"$inc"仍会报错:

"$inc"键的值也必须为数字.

数组修改器

"$push"和"$pop"只能用于数组.

如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.

如:

db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

向以上文档中,添加一个包含一个数组的"comment"键,还向 comment 数组push一个评论.

这个数组会自动创建,并加入评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor2",
        "content":"nice"
      }
    }
  }
)

还想添加一条评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor3",
        "content":"good"
      }
    }
  }
)

如果一个值不在数组里就把它加进去.可以在查询文档时使用"$ne".

使用"$addToSet"

db.users.insert(
  {
    "userName":"refactor",
    "emails":
    [
      "295240648@163.com",
      "295240648@126.com"
    ]
  }
)

向emails添加新地址,用"$addToSet"避免重复

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@163.com"
    }
  }
)

这样"295240648@163.com" 不会插入到emails中

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@qq.com"
    }
  }
)

这样"295240648@qq.com" 会插入到emails中

将"$addToSet"和"$each"一起使用,可以添加不同的值.

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":
      {
        "$each":
        [
          "295240648@111.com",
          "295240648@112.com",
          "295240648@113.com"
        ]
      }
    }
  }
)

使用"$pop",可以从数组任何一端删除元素.

{$pop:{key:1}}从数组末尾删除一个元素
{$pop:{key:-1}}从数组头部删除一个元素

使用"$pull",可以根据特定条件删除元素,也可以根据位置删除元素

db.users.update(
  {"userName":"refactor"},
  {
    "$pull":
    {
      "emails":"295240648@111.com"
    }
  }
)

"$pull"会将所有匹配的部分删掉,对于数组[1,1,2,1]执行pull 1,得到的结果数组是[2]
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
交通工程好考公务员吗 交通工程类考公时包括哪些专业 交通工程专业的能报考什么样的公务员 交通工程专业往哪些方向考公务员 交通工程可以考公务员有哪些岗位 我专业交通工程。能考什么类型的公务员 支付宝怎么关联另一个账号 支付宝怎么关联另一个支付宝 支付宝关联账号在哪里?怎么添加? 京东买手机发票可以开别人名字吗 有没有什么比较好听的歌曲,纯音乐版的。 寻找纯音乐 全民k歌里纯音乐怎么查找,就是想用纯音乐,歌词是加自己的,怎么弄 在哪里能找到热门流行歌曲的纯音乐版 怎样找到歌曲的纯音乐版本? 白色T恤发黄怎么办,白色T恤怎么洗白,白T 抖音作品封面怎么是黑色,要点看才可以?- 问一问 机油开封以后能够存放多久? - 信息提示 已开封的机油有保质期吗?有没有人留意过? 中国新民主主义*为什么要走与前苏联所不同的*道路?谁为我们指明了这条 打开的机油保质期多长时间 为什么中国新民主主义革命要走农村包围城市的道路 开封的机油可以放多久 为什么我在yy上根主播说话他们都不理我 上次保养剩下开封过的机油的保质期是多久? 中国新民主主义革命为什么要走农村包围城市的道路? 中国革命为什么必须经过一个新民主主义革命阶段? YY上最逗比搞笑的女主播是谁? 开封过的机油有保质期吗? 青岛华为售后服务中心的地点在哪 鹉组词要两个字两个急!!! 鹉能组什么词? 青岛哪有华为手机售后服务点? 鹉什么组词 青岛的华为售后维修点在哪里吗 手机回放监控视频怎么调节快慢速度? 青岛华为手机维修 用鹉怎么组词 青岛华为手机售后在哪 鹉的笔顺 华为青岛维修 五十岁女人洋气的发型? 青岛哪里有华为售后服务中心 青岛市南区华为售后维修点在那里 青岛哪有华为手机售后服务 青岛,城阳 哪里可以维修 华为t2281 直板 手机? 短发五十岁女人自然卷做什么发型 请问谁知道青岛市北的华为售后在哪儿 正在还贷款的期房可以买吗