Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb-';自我学习';索引?_Mongodb - Fatal编程技术网

Mongodb-';自我学习';索引?

Mongodb-';自我学习';索引?,mongodb,Mongodb,这是我第一次使用Mongo的无模式设计,在同一个集合中存储具有不同(不可预测)结构的文档。通常我会避免这种情况,但我需要它的特殊要求 // John stores pruducts, with pricing-related fields: db.myCol.insert({owner:"john", price:100, discount:5}) // Mary stores color preferences: db.myCol.insert({owner:"mary", color:"gr

这是我第一次使用Mongo的无模式设计,在同一个集合中存储具有不同(不可预测)结构的文档。通常我会避免这种情况,但我需要它的特殊要求

// John stores pruducts, with pricing-related fields:
db.myCol.insert({owner:"john", price:100, discount:5})
// Mary stores color preferences:
db.myCol.insert({owner:"mary", color:"green", background:"white"})
当然,约翰会询问价格/折扣,而玛丽会询问颜色。 注意查询的“AND”结构非常简单。

问题是索引——我无法提前告诉用户将存储/查询哪些字段

目前,我可以时不时地手动检查日志,并手动添加/删除索引。但我突然想到,我可能不是第一个遇到这个问题的人——那么,有没有“自我学习”索引的选项,让我的手工工作自动化呢?例如,自动检测许多带有“颜色”的慢速查询(假设它们是简单且结构化的),并相应地添加索引

我很感激任何指点,无论是在Mongo内部还是外部工具。 到目前为止,我发现最有创意的想法是改变文档结构,这样我就可以使用数组索引(有效地索引所有内容),但如果有更优雅的解决方案,我将不胜感激


谢谢:)

您可能想做的是“了解”正在执行的查询类型,以便知道要索引哪些字段

我建议设置l并进行一些日志分析,以便对“常用”字段和组合做出一些决策

db.setProfilingLevel(2)
这将记录所有的操作

您可能还对MongoDB的一名员工的行为感兴趣

该套件实际上由不同的员工“内部”使用,以帮助进行日志分析

值得一试

我无法预先告知用户将存储/查询哪些字段

闻起来像是一个重要的价值商店

其美妙之处在于,您可以动态索引任意数量的字段和数据,并对其进行搜索,即用户定义的字段

例如,您的文档将是:

{
    _id: {},
    owner: 'John',
    fields: [
        price: 100,
        discount: 5
    ]
}
您可以在文档的字段键上建立索引,并使用
$elemMatch
查询用户动态字段

当然,这只是设置键值存储的一种方法,您最习惯看到的方法是使用键
k
v
将键名和键值存储为值

这还允许您查询这些字段的实际名称以及其他一些niefty内容

因此,键值存储可能正是您在这里寻找的

编辑 讽刺的是,我实际上并没有读到:

到目前为止,我发现最有创意的想法是改变文档结构,这样我就可以使用数组索引(有效地索引所有内容),但如果有更优雅的解决方案,我将不胜感激


不幸的是,即使在arr为此类查询设计的技术中(Memcached就是其中之一),它们实际上采用了这种结构,有效地索引了一个数组,但它只是对您隐藏起来。

非常感谢,至少通过确认这种方法,您为我节省了数小时寻找不存在的替代方法的时间。衷心感谢:)非常感谢,我会试试的。