Mongodb提供了一个有趣的“多键”特性,可以自动对对象的数组值进行索引。标签就是个好例子。假定你有一篇包含了许多分类标签的文章:

$ dbshell> db.articles.save( { name: "Warm Weather", author: "Steve",tags: ['weather', 'hot', 'record', 'april'] } )> db.articles.find(){"name" : "Warm Weather" , "author" : "Steve" ,"tags" : ["weather","hot","record","april"] ,"_id" : "497ce4051ca9ca6d3efca323"}

我们可以轻易的对tags数组中的值进行查询:

> db.articles.find( { tags: 'april' } ){"name" : "Warm Weather" , "author" : "Steve" ,"tags" : ["weather","hot","record","april"] ,"_id" : "497ce4051ca9ca6d3efca323"}

更进一步,我们可以对标签数组进行索引。在数组上创建的索引,会对数组的每一个元素进行索引:

> db.articles.ensureIndex( { tags : 1 } )true> db.articles.find( { tags: 'april' } ){"name" : "Warm Weather" , "author" : "Steve" ,"tags" : ["weather","hot","record","april"] ,"_id" : "497ce4051ca9ca6d3efca323"}> db.articles.find( { tags: 'april' } ).explain(){"cursor" : "BtreeCursor tags_1" , "startKey" : {"tags" : "april"} ,"endKey" : {"tags" : "april"} , "nscanned" : 1 , "n" : 1 , "millis" : 0 }

增加和删除关键字
你可以使用$addToSet增加一个新键到数组中,然后使用$pull移除该关键字。

> db.articles.update({name: "Warm Weather"},{$addToSet:{tags:"northeast"}});> db.articles.find();...> db.articles.update({name: "Warm Weather"},{$pull:{tags:"northeast"}});

数组中的内嵌对象

同样的技术还可以用来查找内嵌在数组中的对象的字段:

> // find posts where julie commented> db.posts.find( { "comments.author" : "julie" } ){"title" : "How the west was won","comments" : [{"text" : "great!" , "author" : "sam"},{"text" : "ok" , "author" : "julie"}],"_id" : "497ce79f1ca9ca6d3efca325"}

对给定集合中所有值进行查询

使用$all选项,可以指定匹配所有给定集合中的值。例如:

> db.articles.find( { tags: { $all: [ 'april', 'record' ] } } ){"name" : "Warm Weather" , "author" : "Steve" ,"tags" : ["weather","hot","record","april"] ,"_id" : "497ce4051ca9ca6d3efca323"}> db.articles.find( { tags: { $all: [ 'april', 'june' ] } } )> // no matches

对并行数组的警告

当使用复合索引时,至多可以包含一个数组关键字。所以,如果我们有一个索引{a:1,b:1},下面的文档都是合法的:

{a: [1, 2], b: 1}{a: 1, b: [1, 2]}

下面的文档在插入时会失败,并提示:“不能对并行数组建立索引”:

{a: [1, 2], b: [1, 2]}

该问题是由于复合键的笛卡尔积中的每一个值都要被索引,(如果支持并行数组的话,笛卡尔积会很大,导致索引非常大),这可能很快就会大到失控。

使用多键代替大量索引

一种查询包含很多可选数据的方法是使用多键索引,此时的键都是对象。例如:

> x = {... _id : "abc",... cost : 33,... attribs : [... { color : 'red' },... { shape : 'rect' },... { color : 'blue' },... { avail : true } ]... };> db.foo.insert(x);> db.foo.ensureIndex({attribs:1});> db.foo.find( { attribs : {color:'blue'} } ); // uses index> db.foo.find( { attribs : {avail:false} } ); // uses index

除了可以包含不限数目的属性类型,我们还能动态的增加类型。

这在属性查询时很有用。上述模式对于排序或其他类型查询并不是很有用。

转载于:https://www.cnblogs.com/xinghebuluo/archive/2012/01/31/2332766.html

mongodb指南(翻译)(二十二) - developer zone - 索引(六)多键相关推荐

  1. Gradle 2.0 用户指南翻译——第二十二章. 标准的 Gradle 插件

    翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...

  2. gateway网关_SpringCloud技术指南系列(十二)API网关之Gateway使用

    SpringCloud技术指南系列(十二)API网关之Gateway使用 一.概述 API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Facade模式,它的存在就像是整个微服务架 ...

  3. Highcharts翻译系列十二:gauge测量图

    Highcharts翻译系列十二:gauge测量图 说明 测量图需要highcharts-more.js的支持 属性 参数 描述 默认值 animation 动画 true color 主要颜色或序列 ...

  4. Docker系列(二十四)——Docker实例六Docker安装Redis实例

    < Docker实例三Docker安装Redis实例 > 前言 在前面一篇文章种,完成了 < Docker安装MongoDB实例 >,本篇将继续镜像安装教程,并完成Docker ...

  5. Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Class

    Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Classi ...

  6. 数字符号哥德尔数配置及变元、公式和谓词散议——哥德尔读后之二十二

    数字符号哥德尔数配置及变元.公式和谓词散议--哥德尔读后之二十二 这篇博文折腾了我近一个月,广州从8月以来几乎天天都在摄氏35度的酷热之中,满以为在秋凉之前可以完成,可你要从阅读哥德尔原著中找到些感觉 ...

  7. 读后感: 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)

    波.波.波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二) http://blog.csdn.net/david_lv/archive/2008/06/26/2589809.aspx ...

  8. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  9. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

  10. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

最新文章

  1. python100个必背知识-python学习必备知识汇总
  2. python九九乘法口诀表-python打出九九乘法口诀表
  3. 非洲儿童(南阳oj1036)(馋)
  4. java注解判断字段是否存在_使用注解和反射判断指定的字段不能为空
  5. 小李飞刀:SQL题目第二弹!
  6. AWS load balancer
  7. 小程序设置header cookie
  8. 使用叶神模拟器无法访问本机服务器的问题(报错:java.net.ConnectException: failed to connect to /127.0.0.1 (port 5000) )
  9. 高效Java第六条消除过期的对象引用无意识的对象保持
  10. C语言的typedef用法
  11. 机器学习算法 - 随机森林之决策树初探(1)
  12. 新年计算机等级的决定的英语,新年决定英语对话及译文
  13. 深入理解JVM(4)——如何优化Java GC
  14. kubadm运行逻辑——init-certs证书的生成与创建
  15. 图片去水印的原理_神奇的Photoshop去除图片水印方法
  16. 高铁检测试验软件,高铁规划要点及测试情况分析
  17. Python 猴子偷桃
  18. 山科OJ:Problem C: Lemon
  19. 定时启动你的Android App
  20. Android进入欢迎界面前显示黑乎乎的或者白白的布局

热门文章

  1. DeepLearning tutorial(1)Softmax回归原理简介+代码详解
  2. 在Android Studio中进行代码混淆
  3. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
  4. 企业需要建设网站该如何咨询价格呢?
  5. Android开发各类常见错误解决方案
  6. 2014百度研发真题及其解析-求比指定数大且最小的“不重复数”
  7. Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-03
  8. kafka的简单使用
  9. HDU 4267 A Simple Problem with Integers
  10. Django使用心得(四)