首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDB中有效地实现这些查询?

如何在MongoDB中有效地实现这些查询?
EN

Stack Overflow用户
提问于 2010-09-15 19:13:00
回答 2查看 357关注 0票数 6

链接有一个或多个标记,所以一开始嵌入标记似乎很自然:

代码语言:javascript
复制
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']}

如何有效地实现这些查询?

  • 获取包含一个或多个给定标记的链接(用于搜索具有给定标记的链接)
  • 获取不重复的所有标记的列表(用于搜索框自动完成)
  • 获取最流行的标签(显示前10个标签或标签云)

如上所述,表示链接的想法是基于MongoNY表示,幻灯片38。

EN

回答 2

Stack Overflow用户

发布于 2010-09-15 19:22:43

获取包含"value“标记的链接:

代码语言:javascript
复制
db.col.find({tags: "value"});

获取包含"val1“、"val2”标记的链接:

代码语言:javascript
复制
db.col.find({tags: { $all : [ "val1", "val2" ] }});

获取所有标签的列表,不重复:

代码语言:javascript
复制
db.col.distinct("tags");

获取最流行的标记--这不是可以在现有的db上查询的东西,您需要做的是在查询获取文档时添加流行度字段更新它,然后将排序字段设置为流行度进行查询。

更新:为流行特性提出的解决方案。尝试添加以下集合,让我们将其称为标记。

doc ={ tag: String,pop: Integer }

现在,一旦执行了查询,就可以收集显示的所有标记(这些标记可以异步聚合和完成),因此假设您最终得到了以下标记:"tag1“、"tag2”、"tag3“。

然后调用update方法并增加pop字段值:

代码语言:javascript
复制
db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }});
票数 4
EN

Stack Overflow用户

发布于 2010-11-16 08:44:44

您还可以使用$addToSet来更改标记数组,而不是$push。当标记已经存在时,这不会修改文档。如果您经常修改标记(因为文档不会增长那么多),这将更加有效。下面是一个示例:

代码语言:javascript
复制
> 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" ] }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3720972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档