MongoDB通配符索引的用法实例_MongoDB

来源:脚本之家  责任编辑:小易  

首先下载Mongo程序,到2113官方网站上选择适合自己的版本5261下载,在这4102里我选择的win32平台下的程序包。解压之后1653配置相应的环境变量,即可在CMD命令窗口对Mongo进行操作。搭建环境变量。把下载的程序包mongodb-win32-i386-2.0.7,解压到相应的路径。在启动mongoDB之前,我们必须新建一个存放mongoDB数据和日志的目录。便于管理我在C:\mongodb-win32-i386-2.0.7该目录下创建了data、logs文件夹(在系统中哪里创建都可以,关键是在启动时候要作为参数启动),在logs目录下手动创建日志文件--mongo.log或者在命令中输入文件名称,会自动创建www.zgxue.com防采集请勿采集本网。

指南

MongoDB在4.2 版本推出了Wildcard Indexes,究竟什么是Wildcard Indexes以及Wildcard Indexes适合哪些场景本文结合官方文档以及实际测试进行简单概述。

您好,很高兴为您解答。 参考下:http://www.dewen.io/q/6181 如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】 希望我的回答对您有所帮助,望采纳! ~ O(∩_∩)O~

1、通配符索引示例

DBCollection dbc = db.getCollection("role"); dbc.setHintFields(null); 虽然3.0以后版本中 DBCollection方法 已过时,可以将就用 直接用 $hint 操作符 db.users.find( { name: {}, $hint: { age : 1 } } ) 参考地址 https://docs.mongodb.org

因为MongoDB是dynamic schemas,所以应用是可以查询任何已知字段或者随机字段的。

mongodb在前台直接运行建立索引命令的话,将造成整个数据库阻塞,因此索引建议使用 background 的方式建立。但是这也会带来一定的问题,在 2.6 版本之前,在 secondary server 中即使使用 background 方式建立索引,secondary 还是会以 foregrou.

假设(此假设案例摘自官方文档),集合colA的UserMetadata字段包含如下数据:

update和findAndModify都可以用做更新操作; 区别 findAndModify是有返回值的,输出中的value字段即返回修改之前的文档,使用 new:true选项返回修改后的文档。 update是更新操作,是没有返回值的。 findAndModify 强调操作的原子性(atomically

{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } }{ "userMetadata" : { "dislikes" : "pickles" } }{ "userMetadata" : { "age" : 45 } }{ "userMetadata" : "inactive" }

您好 参考资料: mongodb索引的优化 http://www.studyofnet.com/news/456.html

但是在查询的时候可能是如下语句:

db.colA.find({ "userMeta2通配符索引的形式data.likes" : "dogs" })db.colA.find({ "userMetadata.dislikes" : "pickles" })db.colA.find({ "userMetadata.age" : { $gt : 30 } })db.colA.find({ "userMetadata" : "inactive" })

是否能通过一个索引来完成上述需求?

答案是肯定的,上述查询可以通过通配符索引来实现既定需求,也就是 db.colA.createIndex( { "userMetadata.$**" : 1 } )。

那么如何创建通配符索引?

注意:首先应该明确的是通配符索引只在版本兼容性4.2的时候才能创建。

如何查询版本兼容性?

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

如何设置?

db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )

2、通配符索引的形式

单字段通配符索引

{ "_id" : ObjectId("5ee2df16911d8dfaa91520b4"), "product_name" : "Spy Coat", "product_attributes" : { "material" : [ "Tweed", "Wool", "Leather" ], "size" : { "length" : 72, "units" : "inches" } }}{ "_id" : ObjectId("5ee2df30911d8dfaa91520b5"), "product_name" : "Spy Pen", "product_attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts" } }}

如果数据结构是上面这样的,其中product_attributes 属性包含任何的结构。

那么如果我们创建一个这个索引,它会进行什么操作?

db.product_catalog.createIndex({"product_attributes.$**":1})。

因为product_attributes 里面包含数组和嵌套文档等对象,实际创建这个索引后,会迭代嵌套文档或者数组把里面的所有的值都取出来放到索引里。支持如下查询:

db.product_catalog.find({"product_attributes.colors":"Blue"})db.product_catalog.find({"product_attributes.secret_feature.name":"laser"})db.product_catalog.find({"product_attributes.size.length":{$gt:60}})

全字段的通配符索引

可以通过下面的语句创建一个索引,索引中包含集合中的所有字段,但是不包括_id(如果想包含_id可以通过wildcardProjection 来设置),如果集合中的字段包含数组或者嵌套对象的话,那么会迭代数组或者嵌套对象并把值放到索引中。

Db.product_catalog.createIndex({“$**”:1})

给每个文档添加一个address的字段。

7777:PRIMARY> db.product_catalog.find().pretty(){ "_id" : ObjectId("5ee2df16911d8dfaa91520b4"), "product_name" : "Spy Coat", "product_attributes" : { "material" : [ "Tweed", "Wool", "Leather" ], "size" : { "length" : 72, "units" : "inches" } }, "address" : "Beijing"}{ "_id" : ObjectId("5ee2df30911d8dfaa91520b5"), "product_name" : "Spy Pen", "product_attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts" } }, "address" : "Tianjin"}db.product_catalog.find({"product_name":"Spy Coat","address":"nanji","product_attributes.colors":"Blue"})

在全字段通配符索引的基础上可以明确包含哪些或者不包含哪些字段到通配符索引中,只能是在全字段通配符索引的基础上,单字段的是不可以的:

在全字段的基础上创建一个明确包含哪些字段的索引:

db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 1, "fieldB.fieldC" : 1 } })

注意:通配符索引不支持在使用wildcardProjection的时候混合使用包含和排除语句,除了明确指定包含_id字段的时候。

在全字段的基础上创建一个明确不包含哪些字段的索引:

db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 0, "fieldB.fieldC" : 0 } })

3、通配符索引的行为

通配符索引的行为根据其字段类型不同而有所不同。 字段为对象

如果是对象的话,会将对象中的内容存储到索引中,通配符索引会把对象中的所有嵌套对象加载到索引中。 字段为数组

如果是数组的话,通配符索引遍历数组并且将每个元素都存储到索引中。

如果数组中的元素是一个对象的话,通配符索引把对象中的内容加载到索引中,像上面的加载对象一样。

如果数组中的元素是一个数组的话(就是多维数组),通配符索引并不迭代嵌套数组,相反是把整个嵌套数组作为一个值来看。 其他类型

把值记录到数组中。

通配符索引会持续迭代任何的嵌套对象或者数组直到最底层(就是不能在迭代为止),然后它会索引全路径。

通配符索引对于显示数组位置的查询

通配符索引虽然不会记录给定数组中的元素下标,但是,MongoDB仍然可以选择通配符索引来满足包含一个或多个显式数组索引的字段路径的查询(for example, parentArray.0.nestedArray.0)

由于为每个连续嵌套数组定义索引边界的复杂性日益增加,如果该路径包含8个以上的显式数组索引,MongoDB不会考虑使用通配符索引来回答查询中的给定字段路径。MongoDB仍然可以考虑使用通配符索引来回答查询中的其他字段路径。

如果超过了8个以上显示数组索引的话MongoDB 会考虑另外的索引或者执行全集合扫描。如下结构:

{ "parentObject" : { "nestedArray" : [ "elementOne", { "deeplyNestedArray" : [ "elementTwo" ] } ] }}

请注意,通配符索引本身对索引文档时遍历文档的深度没有任何限制;该限制仅适用于显式指定精确数组索引的查询。通过发出没有显式数组索引的相同查询,MongoDB可以选择通配符索引来回答查询。

4、通配符索引的限制

1.首先通配符索引是一个稀疏索引,只存放存在的字段在索引里面,不存在的不存放,也就是说当你使用{$exists:false}的时候,是不会走索引的,是全集合扫描。

db.test_new_wildidx.find({"block.attr":{$exists:false}})

db.test_new_wildidx.find({"block.attr":{$exists:true}})  但是支持true的。

2.通配符索引不支持直接等于/不等于一个对象或者数组。

通配符索引会将对象或者数组中的元素加载到索引中,而不是整体放到索引中。故通配符索引不支持直接用文档或者数组来匹配。

所以上面的例子如果

7777:PRIMARY> db.test_new_wildidx.find({"block.attr.address_new": ["haicheng", "beijing", "chongqing"]})

就是想匹配整个数组的话,是不可能用到通配符索引的。

那么如果有这个需求该如何解决?Db.test_new_wildidx.createIndex({"block.attr.address_new":1}) 通过这个索引来解决。

虽然通配符索引不支持整个文档或者对象直接精准匹配查询,但是支持数组或者对象为空{} 这种操作:

7777:PRIMARY> db.test_new_wildidx.find({"block.attr": {}})7777:PRIMARY> db.test_new_wildidx.find({"block.attr.address_new": {}})

3. 通配符索引支持如下索引类型或者或者属性:

Compound

TTL

Text

2d (Geospatial)

2dsphere (Geospatial)

Hashed

Unique

4.通配符索引不支持文档中的数组$ne null这种。其实不光是数组,别的字段也同样,只要是$ne都不会使用通配符索引。

5、总结

通配符索引在一定程度上可以应对在建模初期对于索引建立疏忽的遗漏,但是如果一味依赖通配符索引来解决查询中的各种精确字段的匹配那就是郑人买履了,在实际测试中通配符索引和精确字段的索引相比随着数据的增长效率逐渐下滑。这也是官方不是很建议使用通配符索引来替代常规索引的原因。

到此这篇关于MongoDB通配符索引的文章就介绍到这了,更多相关MongoDB通配符索引内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:MongoDB索引使用详解MongoDB的基础查询和索引操作方法总结MongoDB中唯一索引(Unique)的那些事MongoDB中创建索引需要注意的事项mongodb处理中文索引与查找字符串详解深入理解MongoDB的复合索引Mongodb索引的优化

mongodb在前台直接运行2113建立索引命令的话,将造成整个数据5261库阻塞,因此索4102引建议使用 background 的方式建1653立。但是这也会带来一定的问题,在2.6 版本之前,在 secondary server 中即使使用 background 方式建立索引,secondary 还是会以foreground 方式建立索引,它导致 secondary 同样引发数据库阻塞问题。2.6 版本修复了这个 Bug,2.6 版之后使用background 方式建立索引时,真正转向后台运行了。为了尽量降低建立索引对 MongoDB Server 的影响,有一种方法是把 MongoDB Server 转换成 standalone 模式后建立。具体做法如下:1.首先把 secondary server 停止,在取消 --replSet 参数,并且更改 MongoDB port 之后重新启动 MongoDB,这时候 MongoDB 将进入 standalone 模式;2.在 standalone 模式下运行命令 ensureIndex 建立索引,建议使用 foreground 方式运行;3.建立索引完毕之后关闭 secondary server 按正常方式启动;4.根据上述 1~3 的步骤轮流为 secondary 建立索引,最后把 primary server 临时转换为 secondary server,同样按 1~3 的方法建立索引,再把其转换为 primary server。这种方式还是比较麻烦的,但可以把建立索引操作对 MongoDB 的影响降到最低,在有些情况下还是值得做的内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mongodb 4.0事务回滚的辛酸历程探究
  • mongodb的mongo shell常用操作方法及操作脚本笔记
  • mongodb中非常好用的aggregate入门教程
  • mongodb 主从复制实例讲解
  • 关于mongodb参数说明与常见错误处理的总结
  • mongodb数据库误删后的恢复方法(两种)
  • mongodb 数据类型及mongoose常用curd
  • 详解mongodb主从复制搭建详细过程
  • mongodb教程之基本管理命令
  • mongo中模糊查询的综合应用
  • mongodb索引添加后怎么使用
  • mongodb可以通过实例名区分不同实例么
  • mongodb 查询 可以使用多少个索引
  • 运行两个实例的mongodb怎么使用
  • MongoDB-mongodb的二维空间索引,使用的是什么数据...
  • java操作MongoDB使用强制索引的方法
  • mongodb 何时使用索引,使用怎么样的索引
  • mongodb update 用到索引吗
  • mongodb 只会使用一个索引 会优化使用哪个索引
  • 查询mongodb有哪些存在的索引
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mongodb索引使用详解mongodb的基础查询和索引操作方法总结mongodb中唯一索引(unique)的那些事mongodb中创建索引需要注意的事项mongodb处理中文索引与查找字符串详解深入理解mongodb的复合索引mongodb索引的优化mongodb 4.0事务回滚的辛酸历程探究mongodb的mongo shell常用操作方法及操作脚本笔记mongodb中非常好用的aggregate入门教程mongodb 主从复制实例讲解关于mongodb参数说明与常见错误处理的总结mongodb数据库误删后的恢复方法(两种)mongodb 数据类型及mongoose常用curd详解mongodb主从复制搭建详细过程mongodb教程之基本管理命令mongo中模糊查询的综合应用mongodb常用操作命令大全mongodb各种查询操作详解mongodb数据库插入、更新和删除操mongodb 数据库操作--备份 还原 mongodb插入数据的3种方法mongodb中使用distinct去重的简单mongodb整库备份与还原以及单个cmongodb查询操作限制返回字段的方浅谈mysql和mariadb区别(mariadbmongodb 实现远程连接mongodb使用心得简单总结mongodb在系统数据库local中无法创建用户java操作mongodb数据库示例分享mongodb中的一些坑(最好不要用)mongodb分片测试mongo复制集同步验证的实例详解1亿条记录的mongodb数据库随机查询性能测使用centos系统中的crontab命令对mongodb关于mongodb 认证鉴权你需要知道的一些事mongodb磁盘io问题的3种解决方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved