- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个文档结构:
{
"key": {
"a": Int32,
"b": String
}
}
在 key
上有唯一索引,在 key.a
和 key.b
上有索引(非唯一)。
然而,此查询扫描(慢):
{"key.a": 456213154}
并且这个查询没有:
{"key": {
"a": 456213154,
"b": {"$exists": true}
}}
为什么这是必要的,应该这样做吗?
(我应该提到这是 v2.0.3)
编辑:添加说明:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BtreeCursor key.a_1",
"nscanned" : 10962,
"nscannedObjects" : 10962,
"n" : 10962,
"millis" : 20,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key.a" : [
[
456213154,
456213154
]
]
}
}
> db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}}).explain()
{
"cursor" : "BtreeCursor key_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key" : [
[
{
"a" : 456213154,
"b" : {
"$exists" : true
}
},
{
"a" : 456213154,
"b" : {
"$exists" : true
}
}
]
]
}
}
编辑:我尝试删除两个非唯一索引(key.a_1
和 key.b_1
)以查看这是否会影响查询。它不是:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 23240518,
"nscannedObjects" : 23240518,
"n" : 10962,
"millis" : 15047,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
最佳答案
您的 explain()
输出表明:
有 10962 个对象具有 key.a : 456213154
。您的 db.collection.find({"key.a": 456213154})
查询使用了 key.a
上的索引,并返回了 10962 个对象。
您的集合中有 0 个对象具有 key.a : 456213154
和 key.b : { $exists : true }
。 db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}})
查询确实使用了键上的索引。
查看每个查询的 n
值 - 这是返回的数字;和 cursor
值 - 如果使用索引,则为 BtreeCursor
。在这种情况下,为什么第一个查询需要更长的时间是有道理的,因为它要返回的对象要多得多。
您确定具有 key.a : 456213154
值的文档也具有 key.b
值吗?
编辑:
带有 $exists
参数的查询是检查嵌入文档中是否存在的错误语法。
试试 db.collection.find({ "key.a": 456213154, "key.b": { "$exists": true } })
。
关于使用点表示法的 Mongodb 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842632/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!