- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在电子商务应用程序中,我有这样的文档:
{ category:'A', ..., price:122,
attr:{ width:6, height:4, hasLCD:true, lcdType:'some text', ..., a36:null }
}
即每个产品都有许多简单类型的属性。
现在我想通过包含顶级字段和一些属性的动态查询来过滤产品。例如:
find({category:'A', price:{$lt:200}, ...,
'attr.height':{$lt:6}, 'attr.hasLCD':true, 'attr.lcdType':{$in:[...]}, ...})
我希望它能够快速执行。
尝试对所有可能的“attr.*”变体进行索引会给我一个错误(复合键太多)。我还怀疑,如果我以这种方式对其进行索引,然后在查询索引中省略其中一个属性将无法正常工作。
尝试将“attr”作为一个整体进行索引也无济于事。
在 MongoDB 下建模的正确方法是什么?
更新
我试过了this方法(也提到了 here )。 IE。将属性存储为键值对数组:
attr2: [ {tag:'lcgType', value:'some text'}, ...
然后像这样索引它:
ensureIndex({ 'attr2.tag':1, 'attr2.value':1 })
然后像这样查询:
find({attr2:{$all:[
{$elemMatch:{tag:'bestseller',value:true}},
{$elemMatch:{tag:'weight',value:{$lte:100}}}
]}})
现在 explain() 说它正在使用 "BtreeCursor attr2.tag_1_attr2.value_1"
但仍然是 "nscanned": 31607
并且整个执行时间实际上是 增加(与非索引方案相比)。
这里有问题。
子问题
如果我选择一些(少于 31 个)最常查询的属性并尝试在这些属性上建立索引会怎样?如果我将它们全部放在单个复合索引中:
ensureIndex({'attr.a1':1, 'attr.a2':1, ...})
根据docs此索引不会用于缺少 attr.a1
属性的查询。
在这种情况下如何定义索引?
最佳答案
如果您真的必须允许大量的过滤器、组合甚至排序,MongoDB 不是一个好的选择,因为它使用 only one index per query .索引的数量增长太快,因为 compound keys are somewhat inflexible (应该回答子问题)并成为性能 pig 。
使用 ElasticSearch、SolR 等搜索数据库,而不是具有您需要的功能的搜索数据库。如果您想在 MongoDB 中保留基本信息,您可以在搜索服务器返回的 ID 上使用 $in
(让搜索数据库简单地复制主数据库的信息通常是个好主意数据存储,因此您不需要双向同步更改,这将是一场噩梦)
关于许多(嵌套)字段/属性上的 MongoDB 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692105/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!