链接有一个或多个标记,因此首先嵌入标记似乎很自然:
link = { title: 'How would you implement these queries efficiently in MongoDB?'
url: 'http://stackoverflow.com/questions/3720972'
tags: ['ruby', 'mongodb', 'database-schema', 'database-design', 'nosql']}
如何有效实施这些查询?
如上所述表示链接的想法基于MongoNY presentation,幻灯片38。
答案 0 :(得分:4)
获取包含“value”标记的链接:
db.col.find({tags: "value"});
获取包含“val1”,“val2”标记的链接:
db.col.find({tags: { $all : [ "val1", "val2" ] }});
获取所有标签的列表而不重复:
db.col.distinct("tags");
获取最受欢迎的标签 - 这不是可以在现有数据库上查询的内容,您需要做的是在查询提取文档时添加一个流行度字段更新它,然后使用排序进行查询字段设置为受欢迎程度。
更新:建议的热门功能解决方案。 尝试添加以下集合,我们称之为标记。
doc = {tag:String,pop:Integer}
现在,一旦你进行查询,你就会收集所有显示的标签(这些标签可以聚合并异步完成),所以假设你最终得到以下标签:“tag1”,“tag2”,“tag3”。< / p>
然后调用update方法并增加pop字段值:
db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }});
答案 1 :(得分:0)
您还可以使用$ addToSet来更改标记数组而不是$ push。当标记已存在时,这不会修改文档。 如果您经常修改标签(因为文档不会增长那么多),这将更有效。 这是一个例子:
> db.tst_tags.remove()
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag3'}}, true)
> db.tst_tags.find()
{ "_id" : ObjectId("4ce244548736000000003c6f"), "name" : "test",
"tags" : [ "tag1", "tag2", "tag3" ] }