一、介绍

MONGODB 的表结构 很灵活 。主要还是因为 字段中可以包含 【 数组】、【内嵌文档】。

现在简单介绍一下 字段中的【 数组】、【内嵌文档】相关的一些操作

(为了方便理解,还是以表来理解mongodb 里的文档)

数组1

1、数组

是一组数,可以是有序对象,也可以是无序对象
可以是不同数据类型,也可以相同数据类型

{“things”:[“pie”,3.14]}{name:”Joe”,
Age:25,
Status:”A”,
Groups:[“news”,”sports”]}

2、文档

文档 可以做为【键】的值,这样的文档就是内嵌文档,这样处理的目的是使用数据组织更为自然。

如果键多时,在每次访问时只取需要的键,而非全部键都取。从而优化读取效率。

{      name:{first:”John”,last:” Doe”},
Age:23,
Address:{street:”nanjing 100#”,city:”Nanchang”,province:”Jiangxi”},
Tel:{tel:”0792-12133232”,mobile:”134232232323”,fax:”0792-243453433”}
}

3、数组查询

> db.food.find()
{ "_id" : 1, "fruit" : [  "apple",  "banana",  "peach" ] }
{ "_id" : 2, "fruit" : [  "apple",  "kumquat",  "orange" ] }
{ "_id" : 3, "fruit" : [  "cherry",  "banana",  "apple" ] }

3.1 查询包含”apple”或者”banana”的文档,则使用”$in”

> db.food.find({fruit:{$in:[" apple “,”banana”]}})
{ "_id" : 1, "fruit" : [  "apple",  "banana",  "peach" ] }
{ "_id" : 2, "fruit" : [  "apple",  "kumquat",  "orange" ] }
{ "_id" : 3, "fruit" : [  "cherry",  "banana",  "apple" ] }

3.2 查询既包含”apple”并且又包含”banana”的文档

> db.food.find({fruit:{$all:["apple","banana"]}})
{ "_id" : 1, "fruit" : [  "apple",  "banana",  "peach" ] }
{ "_id" : 3, "fruit" : [  "cherry",  "banana",  "apple" ] }

3.3 使用”$size“可以查询指定长度的数组

我先插入一条新的记录:

 > db.food.insert({fruit:["Watermelon"]})

查询只有一个水果列表的新添加记录:

> db.food.find({fruit:{$size:1}},{_id:0,fruit:1})
{ "fruit" : [  "Watermelon" ] }

查询有3种水果的记录:

> db.food.find({fruit:{$size:3}},{_id:0,fruit:1})
{ "fruit" : [  "apple",  "banana",  "peach" ] }
{ "fruit" : [  "apple",  "kumquat",  "orange" ] }
{ "fruit" : [  "cherry",  "banana",  "apple" ] }
>

3.4  使用 ”$slice“ 指定 返回数据中的某几条数据

原数据如下:

> db.blog.findOne()
{
"_id" : 1,
"title" : "Hello World",
"content" : "My first blog.",
"comments" : [{"name" : "joe","content" : "test"},{"name" : "Zhang","content" : "so so .."},{"name" : "Li","content" : "very good"}]
}
>

一条博客里有多条点评。但我要指定返回两条点评。(

$slice:[1,2] 从[1]开始,取2条 ,数组序号以0 开始。  )

> db.blog.findOne({},{"comments":{$slice:[1,2]}})
{
"_id" : 1,
"title" : "Hello World",
"content" : "My first blog.",
"comments" : [{"name" : "Zhang","content" : "so so .."},{"name" : "Li","content" : "very good"}]
}
>

当然,你也还可以指定显示特别指定要返回的点评记录:

如:最后一条点评

> db.blog.findOne({},{"comments":{$slice:-1}})
{"_id" : 1,"title" : "Hello World","content" : "My first blog.","comments" : [{"name" : "Li","content" : "very good"}]
}

前两条:

> db.blog.findOne({},{"comments":{$slice:2}})
{"_id" : 1,"title" : "Hello World","content" : "My first blog.","comments" : [{"name" : "joe","content" : "test"},{"name" : "Zhang","content" : "so so .."}]
}
> 

3.5 数组更新、添加

> db.food.insert({_id:4,fruit:['neo4j','mysql','redis']})
> db.food.find({_id:4})
{ "_id" : 4, "fruit" : [  "neo4j",  "mysql",  "redis" ] }
> db.food.update({_id:4},{“$pull”:{“fruit”:“neo4j”}})  #删除指定值
> db.food.find({_id:4})
{ "_id" : 4, "fruit" : [  "mysql",  "redis" ] }
> db.food.update({_id:4},{“$pop”:{“fruit”:1}})   #删除最后一个值
> db.food.find({_id:4})
{ "_id" : 4, "fruit" : [  "mysql" ] }
> db.food.update({_id:4},{“$push”:{“fruit”:“mongo”}}) #添加一个值
> db.food.find({_id:4})
{ "_id" : 4, "fruit" : [  "mysql",  "mongo" ] }
>

3.6 内嵌子文档查询

这个用得比较多,大家也很熟悉,就象对象引用是一样的。多层间使用“." 但如果层次越来越多,在查询,更新时。就会越来越不方便了。容易出错。

内嵌子文档查询

> db.tst_3layer.find()
{ "_id" : 1, "po" : { "prod" : { "_id" : 1, "name" : "mongobook" }, "qty" : 1, "price" : 10, "amount" : 10 } }
{ "_id" : 2, "po" : { "prod" : { "_id" : 2, "name" : "oracle book" }, "qty" : 2, "price" : 230, "amount" : 460 } }> db.tst_3layer.find({"po.prod._id":1})
{ "_id" : 1, "po" : { "prod" : { "_id" : 1, "name" : "mongobook" }, "qty" : 1, "price" : 10, "amount" : 10 } }
>

【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】相关推荐

  1. MongoDB进阶-内嵌文档查询

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded), ...

  2. mongodb java 内嵌文档_MongoDB 内嵌文档

    MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子 ...

  3. MongoDB操作内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

  4. mongodb对数组元素及内嵌文档进行增删改查操作(转)

    from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...

  5. mongodb 统计内嵌文档中某一属性的方法

    需要统计内嵌文档(内嵌文档数组个数不定)所有数组中某一属性值的个数,个人知识现在无法使用 聚合函数count直接得到结果,于是写了以下代码,仅供参考. var t = db.json.find({&q ...

  6. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  7. mongodb 查询内嵌文档

    原文:http://www.cnblogs.com/silentjesse/p/3598399.html mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XX ...

  8. mongoDb内嵌文档的数据查询

    导读 本文档主要讲述在内嵌文档中数据的筛选,内容如下 - 获取内嵌文档某特定数据 - 获取多个内嵌文档的某特定数据 - 获取多层级内嵌文档中的某特定数据 - 获取内嵌文件特定数据,并利用排序和分页筛选 ...

  9. MongoDB内嵌文档查询

    MongoDB内嵌文档查询 示例数据结构 [{"name": "lisa", "age": 17,"friends": ...

最新文章

  1. CUDA编程快速入门教程
  2. Linux基础8 bash的特性
  3. 【排序】算法(python实现)
  4. LeetCode 1334. 阈值距离内邻居最少的城市(最短路径Dijkstra)
  5. 多个for语句嵌套执行顺序_阿里真实面试题解析之实现多个线程顺序执行的几种方式...
  6. 率土之滨显示未选择服务器怎么办,率土之滨未转服,为什么要转服
  7. 20行python代码的入门级小游戏--源码:猜大小
  8. 数据库存储图片路径并显示图片
  9. 西门子触摸屏脚本程序_西门子触摸屏实例程序
  10. 【TM1640】STM32 TM1640芯片驱动程序
  11. 阿里云短信接口写法参照实例
  12. 数字安全一个都不能少:360为企业数字化转型护航
  13. 认识PaaS、SaaS、LaaS、aPaaS(一堆废话,谨慎进入)
  14. NC11 【模板】01背包
  15. 春暖花开,共迎未来:开源社顾问委员会第一季度会议顺利召开~
  16. 04_Python简答题
  17. 数据结构 - 迭代、递归和分治思想
  18. 算法基础之二叉树理论
  19. dede织梦栏目页和文章页中获取当前栏目名称方法
  20. 如何恢复录音删除的录音文件_小达人点读笔教程5:如何使用点读笔录音

热门文章

  1. 深入理解Java虚拟机——第十二章——Java内存模型与线程
  2. sqlserver安装检测不通过 (重新启动失败)
  3. maven jetty 插件 允许修改 js
  4. Vivado2015.4使用教程(一个完成工程的建立)
  5. 7款Flash和Javascript网页视频播放器
  6. 常量与格式化输出练习
  7. 关于在vue项目中使用wangEditor
  8. pipenv 虚拟环境新玩法
  9. python-第二块:time模块和datatime模块
  10. Source insight 支持汇编