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

ran*_*guy 6 ruby database-design mongodb nosql database-schema

链接有一个或多个标签,因此首先嵌入标签似乎很自然:

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']}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Asa*_*saf 4

获取包含“value”标签的链接:

db.col.find({tags: "value"});
Run Code Online (Sandbox Code Playgroud)

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

db.col.find({tags: { $all : [ "val1", "val2" ] }});
Run Code Online (Sandbox Code Playgroud)

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

db.col.distinct("tags");
Run Code Online (Sandbox Code Playgroud)

获取最流行的标签 - 这不是可以在现有数据库上查询的内容,您需要做的是添加流行度字段,并在查询获取文档时更新它,然后将排序字段设置为受欢迎程度。

更新:针对流行度功能提出的解决方案。尝试添加以下集合,我们将其称为标签。

doc = { 标签:字符串,弹出:整数 }

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

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

db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }});
Run Code Online (Sandbox Code Playgroud)