Mongodb索引问题

时间:2014-08-26 12:42:31

标签: mongodb

我有一个集合,下面是数据:

   "sel_att" : {
        "Technical Specifications" : {
            "In Sales Package" : "Charger, Handset, User Manual, Extra Ear Buds, USB Cable, Headset",
            "Warranty" : "1 year manufacturer warranty for Phone and 6 months warranty for in the box accessories"
        },
        "General Features" : {
            "Brand" : "Sony",
            "Model" : "Xperia Z",
            "Form" : "Bar",
            "SIM Size" : "Micro SIM",
            "SIM Type" : "Single Sim, GSM",
            "Touch Screen" : "Yes, Capacitive",
            "Business Features" : "Document Viewer, Pushmail  (Mail for Exchange, ActiveSync)",
            "Call Features" : "Conference Call, Hands Free, Loudspeaker, Call Divert",
            "Product Color" : "Black"
        },
        "Platform/Software" : {
            "Operating Frequency" : "GSM - 850, 900, 1800, 1900; UMTS - 2100",
            "Operating System" : "Android v4.1 (Jelly Bean), Upgradable to v4.4 (KitKat)",
            "Processor" : "1.5 GHz Qualcomm Snapdragon S4 Pro, Quad Core",
            "Graphics" : "Adreno 320"
        }
    }

上面提到的数据太大了,字段都是动态插入的,我如何索引这些字段以获得更快的结果呢?

5 个答案:

答案 0 :(得分:0)

在我看来,您还没有完全理解基于文档的数据库的强大功能,例如 MongoDB

贝娄只是一些想法:

  • 您有 100万条记录
  • 您对该集合 100万索引值
  • 您必须 RAM 才能在内存中存储 100万个索引值,否则索引的好处就不会那么热衷于显示
  • 是的,您可以进行分片,但需要大量硬件来满足基本需求

您肯定需要的是可以将随机文本动态链接到有价值的索引,并允许您快速搜索大量文本。为此,您应该使用ElasticSearch等工具。

请注意,您可以并且应该将您的内容存储在 NoSQL 数据库中,而 MongoDB 是可行的选项。而对于索引部分 ElasticSearch 有可用的插件来增强两者之间的通信。

P.S。如果我没记错,插件名为MongoDB River

修改

我还为 ElasticSearch 添加了更全面的定义。自从我从维基百科上抓取它以来,我不会因此而受到赞誉:

  

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个   分布式,多租户能力的全文搜索引擎   RESTful Web界面和无架构JSON文档

编辑2:

我已经缩减了一些数字,因为对于大多数项目来说可能都是牵强附会。但主要想法仍然是一样的。不建议将索引用于问题中描述的用例。

答案 1 :(得分:0)

动态字段的索引很棘手。没有通配符索引。您的选择是:

选项A:每当您插入新文档时,请为其每个字段选择ensureIndex sparse:true。当索引已经存在时,它不会执行任何操作,并且当它是新字段时会创建一个新索引。缺点是您将最终获得大量索引,并且由于需要创建/更新所有新旧索引,插入可能会变慢。

选项B:忘记字段名称并将文档重构为键/值对数组。所以

    "General Features" : {
        "Brand" : "Sony",
        "Form" : "Bar"
    },
    "Platform/Software" : {,
        "Processor" : "1.5 GHz Qualcomm",
        "Graphics" : "Adreno 320"
    }

变为

 properties: [
     { category: "General Features", key: "Brand", value: "Sony" },
     { category: "General Features", key: "Form", value: "Bar" },
     { category: "Platform/Software", key: "Processor", value: "1.5 GHz Qualcomm" },
     { category: "Platform/Software", key: "Graphics", value: "Adreno 320" }
 ]

这允许您在properties.categoryproperties.key上创建单个复合索引以覆盖所有数组条目。

答案 2 :(得分:0)

根据您要查询的内容,您最终会将这些字段编入索引。您还可以在MongoDB中拥有二级索引。但是要注意,创建太多索引可能会提高查询性能,但会占用额外的磁盘空间,并且由于重新编制索引会使插入速度变慢。

MongoDB indexes

答案 3 :(得分:0)

简短回答:你不能。使用弹性搜索。 这是setup MongoDB River on Elastic Search

的一个很好的教程

原因很简单,MongoDB不能那样工作。它可以帮助您存储复杂的无模式文档集。但是你无法索引数十个不同的领域并希望获得良好的性能。通常,每个集合最多推荐5-6个指数。

弹性搜索通常在许多其他用例中以上述方式使用,因此它是一种既定模式。例如,Titan Graph DB具有内置选项,可以将ES用于此目的。如果我是你,我会使用它,并且不会试图让MongoDB做一些它不能做的事情。

如果您有时间并且您的数据结构适合(我认为它可能来自上面的json),那么您也可以使用rdbms来分解这些部分并使用类似EAV的动态存储它们图案。弹性搜索更容易启动,并且可能更容易快速实现性能。

答案 4 :(得分:0)

嗯,有很多问题,有很多索引,这里已经讨论过了。但是,如果您需要为动态字段添加索引,则实际上是从mongo db driver创建索引。

因此,假设您使用的是Mongodb JAVA驱动程序,那么您可以创建如下索引:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#creating-an-index

coll.createIndex(new BasicDBObject("i", 1));  // create index on "i", ascending

<强> PYTHON

http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.create_index

因此,当您使用任何驱动程序填充数据并找到新的字段时,您可以使用驱动程序本身触发索引创建,而不必手动执行。

P.S。:我没有尝试过,可能不合适或不可取。

希望这有帮助!