6

链接有一个或多个标签,所以起初嵌入标签似乎很自然:

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。

4

2 回答 2

4

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

db.col.find({tags: "value"});

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

db.col.find({tags: { $all : [ "val1", "val2" ] }});

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

db.col.distinct("tags");

获取最流行的标签 - 这不是可以在现有数据库上查询的东西,您需要做的是添加一个流行度字段,每当查询获取文档时更新它,然后使用排序字段设置进行查询人气。

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

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

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

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

db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }});
于 2010-09-15T19:22:43.350 回答
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" ] }
于 2010-11-16T08:44:44.147 回答