- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有没有办法只在 MongoDB 的字段的一部分上创建索引,例如前 10 个字符?我找不到它的记录(或在这里询问)。
MySQL 的等价物是 CREATE INDEX part_of_name ON customer (name(10));
。
原因:我有一个包含单个字段的集合,其长度从几个字符到超过 1000 个字符不等,平均为 50 个字符。由于有大约一亿个文档,因此很难将完整索引放入内存(根据统计数据,使用 8% 的数据进行测试时,索引已经达到 400MB)。仅对字段的第一部分建立索引会将索引大小减少大约 75%。在大多数情况下,搜索词很短,不是全文搜索。
解决方法是为每个项目添加 10 个(小写)字符的第二个字段,对其进行索引,然后添加逻辑以在搜索词超过 10 个字符时过滤结果(以及额外的字段 is probably needed anyway对于不区分大小写的搜索,除非有人有更好的方法)。不过,这似乎是一种丑陋的方式。
[稍后添加]
我尝试添加第二个字段,其中包含主字段的前 12 个小写字符。这不是一个很大的成功。
以前,平均对象大小是 50 字节,但我忘记了包括 _id 和其他开销,所以我的主字段长度(只有一个)平均接近 30 字节而不是 50。然后,第二个字段索引包含_id 和其他开销。
最终结果(对于我的 8% 样本)是主字段上的索引为 415MB,而 12 字节字段上的索引为 330MB - 仅节省了 20% 的空间,不值得。我可以复制整个字段(以解决不区分大小写的搜索问题),但实际上我应该重新考虑 MongoDB 是否是完成这项工作的正确工具(或者只是购买更多内存并使用两倍的磁盘空间)。
[稍后添加]
这是一个典型的文档,带有源字段和短小写字段:
{ "_id" : ObjectId("505d0e89f56588f20f000041"), "q" : "Continental Airlines", "f" : "continental " }
索引:
db.test.ensureIndex({q:1});
db.test.ensureIndex({f:1});
“f”索引在较短的字段上工作,是“q”索引大小的 80%。我并不是要暗示我在索引中包含了 _id,只是它需要使用那个某处显示索引将指向的位置,因此这是一种开销,可能有助于解释为什么较短的键几乎没有什么区别。
对索引的访问本质上是随机的,它的任何部分都不会比其他任何部分更容易被访问。完整文件的总索引大小可能为 5GB,因此对于那个索引来说并不极端。为其他搜索案例添加一些其他字段,以及它们的关联索引,以及小写数据的副本,确实开始加起来,并且更有可能进行分页和交换(这是一个 8GB 服务器),这就是为什么我开始研究更多简明索引。
最佳答案
MongoDB 无法在字段值的一部分上创建索引。您最好的方法是按照您的建议创建第二个字段。
由于您无论如何都需要第二个字段来进行不区分大小写的高效搜索,因此没有理由不创建它。
索引不存储文档的“_id”字段,它们存储一个 DiscLoc 结构,这是一个低得多的结构:详情请看这里
另请注意,“丑陋”实际上是“关系思维”的产物。 (作为我自己的长期 SQL 用户,我经常发现学习 MongoDB 最难的部分是un——学习我的关系思维。)在面向文档的数据库中,反规范化和复制数据实际上是最好的实践。
关于mongodb - 仅对 MongoDB 中的部分字段建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539664/
我正在尝试使用 Excel 中的间接函数来构建公式以在另一张纸上返回值。 在工作表 A 单元格 D3 的值为 B 我想使用值 B 从名为 App Summary 的工作表中的单元格 B6 返回一个值。
我目前正在使用 LumiSoft 的 SIP 堆栈,并且能够在我的 FreePBX 盒子上成功注册分机并调用另一个软电话。我现在需要做的就是通过调用流式传输 WAV 文件(或 RAW,或任何可行的文件
这个问题已经有答案了: How can I fix 'android.os.NetworkOnMainThreadException'? (65 个回答) 已关闭 8 年前。 我有一个安卓 Activ
我正在使用 ws npm 在服务器端,websocket 在客户端。 从 node-js 运行此代码时它工作正常,但从浏览器运行它会出现以下错误: failed: Error in connectio
当我将鼠标悬停在想要淡入和淡出的内容上多次时,它就会不断重复。即使我停止悬停它。我怎样才能阻止这个? $(".featured").hover(function(){ $(this).find
我需要建立一个 mysql 连接并取回一些数据。我可以使用此代码在 Java 中执行此操作 try{ String username;
不能制造愚蠢。具有下一个文件夹结构: /flint/double-conversion/src /燧石/愚蠢/愚蠢/ 其中/flint/folly 包含自述文件和许可证。作为in the readme
我想在编译主单元之前在程序集中嵌入本地引用。但书面目标不起作用。 WithMetadataValue( 'CopyLocal', 'true' )->Met
我不是软件专家,但我确实需要一些建议。 我正在编写一个 C 程序(在下面剪切/粘贴)以通过 LAN(以太网)建立从我的 Mac Pro 到位于它旁边的基于 Windows XP 的测试仪器的 TCP
我正在构建一个应用程序,我的手机经常将数据发送到我的服务器。由于我将使用我的移动数据,我想知道建立(和拆除?)到我的服务器的 TCP 连接需要多少数据。 最佳答案 TCP 三向握手 Device 1
我有一个带有登录表单的网站。当加载登录表单页面时,我创建一个新的 PDO 对象以查看连接是否正常工作。如果成功打开连接,查看者将看到一个登录表单。如果不成功,他们会收到一条消息,说明服务器已关闭。 然
构建我的Electron应用程序后,它将显示产品名称undefined。如何设置其他名称呢? 当前是这样的: 最佳答案 请尝试此操作。引用此链接 https://www.electronjs.org/
我有一个项目在哪里使用这个 jar 。 据我所知...发生 war 之后,文件夹WEB-INF/lib必须具有: mail-1.4.1.jar activation-1.1.jar mysql-con
代码: %{ #include #include #include #include "gener.h" #include "sym_tab.h" #include "scope.h" #inc
我需要将侧边栏小部件集成到我的高流量页面(称为SiteA)中。该小部件应包含我的其他页面之一(称为 SiteB)的最新文章。 在我看来,我有两种可能的解决方案。 SiteA 上的 cUrl 调用从 S
我正在尝试建立 Cortana 技能,以便能够使用 Surface 相机拍照。怎么做?目前我的技能是能够使用bot框架和使用nodejs来回答问题。代码看起来像 bot.dialog('ScanCar
这个问题在这里已经有了答案: Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExce
当我与网络服务器建立 https 连接时出现 SSLProtocolException。我只在 Android 2.3 Gingebread 中有这个异常(exception);相同的代码在所有其他
我想做的是指定几个端口,然后检查它们是否已建立连接。我找到了以下脚本并运行了,但它只列出了 3 个端口,我不明白为什么。我验证了相关端口的事件规则(以及下面输出中未列出的许多其他端口)。 Set ob
使用 MySQL 我试图使用已经上传到数据库中的数据建立一对多关系。举个例子,假设我在一个表中有一个名字列表,我想将它们连接到一个他们去过的地方的列表。显然 1 个人可以去很多不同的地方,但我在设置时
我是一名优秀的程序员,十分优秀!