mongoDB's Multikeys feature

简介:
MongoDB provides an interesting "multikey" feature that can automatically index arrays of an object's values.
# 测试
> db.articles1.save( { name: "Warm Weather", author: "Digoal",  tags: ['weather', 'hot', 'record', 'april'] } )
> db.articles1.find()
{ "_id" : ObjectId("4d23e43f9ae655253f80e95e"), "name" : "Warm Weather", "author" : "Digoal", "tags" : [ "weather", "hot", "record", "april" ] }

> db.articles1.find( { tags: 'april' } )
{ "_id" : ObjectId("4d23e43f9ae655253f80e95e"), "name" : "Warm Weather", "author" : "Digoal", "tags" : [ "weather", "hot", "record", "april" ] }
# 使用[]之后就是精确匹配了
> db.articles1.find( { tags: ['april'] } )
# 使用$all的话表示包含所有[]列出的values的array
> db.articles1.find( { tags: {$all : ['april']} } )
{ "_id" : ObjectId("4d23e43f9ae655253f80e95e"), "name" : "Warm Weather", "author" : "Digoal", "tags" : [ "weather", "hot", "record", "april" ] }

# 很明显现在没有索引
> db.articles1.find( { tags: {$all : ['april']} } ).explain()
{
        "cursor" : "BasicCursor",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "indexBounds" : {

        }
}

# array 上的索引
> db.articles1.ensureIndex( { tags : 1 } );
> db.articles1.find( { tags: {$all : ['april']} } ).explain()
{
        "cursor" : "BtreeCursor tags_1",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "indexBounds" : {
                "tags" : [
                        [
                                "april",
                                "april"
                        ]
                ]
        }
}

# array中内嵌文档
db.articles2.save( { name: "Warm Weather", author: "Digoal",  tags: ['weather', 'hot', 'record', 'april'], comments : [{"nick" : "digoal" , "say" : "very good"},{"nick" : "francs" , "say" : "very good"}] } )
> db.articles2.find()                                                                 
{ "_id" : ObjectId("4d23e5109ae655253f80e960"), "name" : "Warm Weather", "author" : "Digoal", "tags" : [ "weather", "hot", "record", "april" ], "comments" : [
        {
                "nick" : "digoal",
                "say" : "very good"
        },
        {
                "nick" : "francs",
                "say" : "very good"
        }
] }

# 并行array不允许建立索引,原因是产生笛卡尔积
> db.articles3.save( { name: "Warm Weather", author: "Digoal",  tags: ['weather', 'hot', 'record', 'april'],"tags2" : ["ok"] } )
> db.articles3.ensureIndex( { tags : 1,tags2 :1} );                                                                             
cannot index parallel arrays [tags2] [tags]

# 单一的array可以和非array key组成复合索引 :
> db.articles3.ensureIndex( { tags : 1,name :1} );                                                                                 
> db.articles3.getIndexes()
[
        {
                "name" : "_id_",
                "ns" : "test.articles3",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4d23e6659ae655253f80e963"),
                "ns" : "test.articles3",
                "key" : {
                        "tags" : 1,
                        "name" : 1
                },
                "name" : "tags_1_name_1"
        }
]
目录
相关文章
|
程序员 定位技术 开发者
试了试阿里云的通义灵码 2.5 版
通义灵码 2.5 版是个特别实用的工具,无论是个人开发者还是企业团队,都能从中受益。如果你也在找能提升开发效率的工具,通义灵码绝对值得一试!
816 33
试了试阿里云的通义灵码 2.5 版
|
10月前
|
人工智能 运维 自然语言处理
电力行业Agent案例全解析:从调度到运维,智能体如何重构能源体系
2025年,电力行业迎来智能变革。浙江绍兴电网调度中心内,名为“调度智能体”的数字员工正实时调控百万用户用电与新能源波动,0.8秒完成人工需40分钟的响应。从电网调度、设备运维到客户服务、企业管理,具备自主决策能力的AIAgent正重塑电力系统。它不再是简单工具,而是融合大模型与行业知识的“数字员工”:在绍兴,智能体提升新能源消纳率至100%;在长沙,故障处置提速62%;在南方电网,90%咨询实现秒回;在广州南电科技,公文处理效率提升80%,综合效能跃升75%。未来,多Agent协同、专业化深化与人机协作将推动电力迈向更智能、高效、可靠的新时代。这不是未来,而是正在发生的现实。
2406 1
|
人工智能 API 数据库
MCP Server 开发实战 | 大模型无缝对接 Grafana
以 AI 世界的“USB-C”标准接口——MCP(Model Context Protocol)为例,演示如何通过 MCP Server 实现大模型与阿里云 Grafana 服务的无缝对接,让智能交互更加高效、直观。
4410 124
|
数据采集 存储 人工智能
中企出海,全球性数字运营体系是关键
在全球经济低增长背景下,中国企业出海面临数据合规、跨区域运营等挑战。瓴羊副总裁甄日新在2025阿里云中企出海大会上指出,全球化数字运营体系是关键。瓴羊提供从数据采集到应用的全生命周期解决方案,助力企业应对合规、AI适配及系统碎片化问题,构建全球统一的数据治理与客户服务体系,推动数字化转型与全球竞争力提升。
561 0
|
Java 数据库连接 Maven
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
2391 1
最新版 | SpringBoot3如何自定义starter(面试常考)
|
人工智能 自然语言处理 搜索推荐
【NLP自然语言处理】文本处理的基本方法
【NLP自然语言处理】文本处理的基本方法
|
存储 JavaScript 前端开发
【JavaScript】JavaScript 中的 Class 类:全面解析
【JavaScript】JavaScript 中的 Class 类:全面解析
1073 1
|
安全 Linux 数据安全/隐私保护
【专栏】了解并有效利用 `Chage` 可提升系统安全性和稳定性。
【4月更文挑战第28天】`Chage` 命令在 Linux 中用于管理用户密码策略,包括有效期、过期警告和锁定。本文将介绍如何使用 `chage` 修改这些设置。通过 `chage -l` 查看用户策略,`-M` 设置最大有效期,`-W` 设置过期警告,`-I` 设置过期后锁定天数。文章还将探讨企业环境和特殊用户的应用案例,以及使用时的注意事项,如谨慎修改、通知用户和验证效果。了解并有效利用 `Chage` 可提升系统安全性和稳定性。
593 0
|
存储 缓存 JavaScript
提升Blazor应用性能的探索之旅:深入解析关键技巧与最佳实践
【8月更文挑战第31天】在开发现代Web应用时,性能与用户体验至关重要。Blazor作为一款使用.NET构建交互式Web UI的框架,提供了诸多便利。为了充分发挥其潜力并优化体验,掌握一些性能提升技巧十分必要。本文将分享几个实用的Blazor性能优化方法,包括减少不必要的服务器端调用、使用懒加载以及优化DOM操作。通过这些技巧,可以显著提升应用性能,为用户提供更流畅的体验。以下是具体方法及示例代码。
489 0