我有一个MongoDB数据库,它有一个相当大的文档集合(13GB,大约2M文档),位于一台8GB RAM的服务器上。每个文档都有一个相对较大的文本字段(可以是整个博客文章),其他字段是关于文本内容和文本作者的数据。这是架构的样子:
{
text: "Last night there was a storm in San Francisco...",
author: {
name: "Firstname Lastname",
website_url: "http://..."
},
date: "201403075612",
language: "en",
concepts: [
{name: "WeatherConcept", hit: "storm", start: 23, stop: 28},
{name: "LocationConcept", hit: "San Francisco", start: 32, stop: 45}
],
location: "us",
coordinates: []
}
我打算以不同的方式查询数据:
全文搜索"文字"领域。所以,让我们说我的文本搜索查询是q:
db.coll.aggregate([
{
$match:{
$text: {
$search:q
}
}
}
])
按作者汇总文件:
db.coll.aggregate([
{
$project: {
name: "$author.name",
url: "$author.website_url"
}
},
{
$group: {
_id: "$name",
size: {
$sum:1
},
url: {
$first: "$url"
}
}
},
{
$sort:{
size:-1
}
}
])
按概念汇总文件:
db.coll.aggregate([
{
$unwind: "$concepts"
},
{
$group: {
_id: "$concepts.name",
size: {
$sum:1
}
}
},
{
$sort:{
size:-1
}
}
])
这三个查询还可能包括对以下字段进行过滤:日期,位置,坐标,语言,作者。
我还没有索引,所以查询运行速度非常慢。但是由于我对数据的不同方式的索引会有很大不同,这是否会排除索引作为解决方案?或者有没有办法为所有这些案例编制索引而不必对集合进行分片?基本上我的问题是:
答案 0 :(得分:0)
你的收藏品上有索引吗?
看看以下
http://docs.mongodb.org/manual/indexes/
如果你有索引,请确保通过执行以下操作来点击它们
db.CollectionName.find({"Concept":"something"}).explain();
您还需要向我们提供有关您的设置的更多信息。服务器有多少RAM?我已经使用了一个拥有200GB的MongoDB,分别位于3个分片上。所以1GB上的13GB应该不是问题