- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
短版:
如果我有一个索引 {"category": 1}
和一个文档 {"category": {type: "memory", class: "DDR400"}
,如何使用我的索引进行诸如 {"category.type": "memory"}
之类的查询?
加长版:
对于 MongoDB,我想使用嵌入文档作为索引的键。
例如,我可能有一些这样的文档(用于假设的产品数据库):
{"category": {"type": "hard-drive", "form_factor": "2.5in", "size": "500GB"}, ...}
{"category": {"type": "hard-drive", "form_factor": "3.5in", ...}, ...}
{"category": {"type": "memory", "class": "DDR400", ...}, ...}
对于上面的例子,我可能想做如下查询:
{"category.type": "hard-drive"}
{"category.type": "hard-drive", "category.form_factor": "2.5in"}
{"category.type": "memory"}
{"category.type": "memory", "category.class": "DDR400"}
我的问题是创建索引。位于 http://www.mongodb.org/display/DOCS/Indexes#Indexes-DocumentsasKeys 的文档描述了两个选项:
第一个选项是创建复合索引,例如 { "category.type": 1, "category.class": 1 }
。这不适用于我的情况,因为我可能有许多不同类型的子类别。
第二种选择是使用文档作为键:{ "category": 1 }
。现在像 {"category": {"type": "memory", "class": "DDR400"}}
这样的查询会使用索引,但是 {"category": { "type": "memory"}}
不会返回任何内容,并且 {"category.type": "memory"}
不会使用索引。有没有办法使用这个索引进行查询,结果与 {"category.type": "memory"}
相同?
我怀疑使用类似 {"category"{"$gt": ..., "$lt": ...}
的查询应该可以,但是我应该在有空格吗?
最佳答案
为 category.type
(可能除了 category
之外)创建一个单独的索引似乎是最好的选择。
您可以使用带有 $gt
和 $lt
的范围查询。这些将适用于嵌入对象的二进制表示,它仅适用于第一个(按存储顺序)字段,并且只有第一个字段在所有文档中都相同,所以它不是很灵活,并且容易破坏。
{"category" : {"$gt": {"type": "memory"}, "$lt": {"type": "memoryX" } } }
这里的“memoryX”作为一个分界点:所有带有“memory”的东西都会排在前面。
请注意,这要求“类型”字段是所有具有它的文档的二进制表示形式中的第一个字段。它也仅适用于“类型”字段(无法查询第一个位置的其他字段,您必须预先选择一个),因此与专用的“category.type”索引相比几乎没有优势(只是空间储蓄)。
我之前曾尝试过这个想法,请参阅 this thread on the mailing list .它确实有效,但你必须小心你在做什么:
It is both supported and stable. Many of the sharding/replication internals use _id values that are embedded docs.
The only thing to watch out for here is the ordering of the keys in embedded element. They are sorted by their binary representation so {x:1, y:1} is different than {y:1, x:1}, and sorted differently. Not only are they sorted differently, they are different values. Some languages always sort the keys in a dictionary/hash/map by default.
再次考虑在您需要的字段上创建额外的索引。
In my case I'll only need to query on 'a', 'a,b' or 'a,b,c', or on 'a,x,y', where documents containing x never contain 'b' or 'c'
那可能会起作用。不过,我仍然会做两个复合索引 a,b
和 a,x
。或者也许只是 b
和 x
。鉴于文档包含 b
或 x
,您可能已经有效地过滤掉了与 a
无关的文档(form_factor = 2.5in)告诉你它是一个硬盘,class = DDR400 已经使它成为内存)。在通过 a,b
过滤后,您可能不需要索引来进一步深入了解 c
。
通过对二进制表示使用这个棘手的查询,您使自己依赖于可以称为实现细节的东西。您可能会遇到喜欢重新排序字段的驱动程序,或者像 this issue 这样的东西。关于 Mongo 本身有时会重新洗牌。
关于使用嵌入文档作为键的 MongoDB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6607127/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!