gpt4 book ai didi

使用嵌入文档作为键的 MongoDB 查询

转载 作者:IT老高 更新时间:2023-10-28 12:29:20 26 4
gpt4 key购买 nike

短版:

如果我有一个索引 {"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,ba,x。或者也许只是 bx。鉴于文档包含 bx,您可能已经有效地过滤掉了与 a 无关的文档(form_factor = 2.5in)告诉你它是一个硬盘,class = DDR400 已经使它成为内存)。在通过 a,b 过滤后,您可能不需要索引来进一步深入了解 c

通过对二进制表示使用这个棘手的查询,您使自己依赖于可以称为实现细节的东西。您可能会遇到喜欢重新排序字段的驱动程序,或者像 this issue 这样的东西。关于 Mongo 本身有时会重新洗牌。

关于使用嵌入文档作为键的 MongoDB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6607127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com