存储和检索用户最喜欢的标签

时间:2011-10-20 06:40:39

标签: mongodb analytics nosql

我正在尝试在我的电子商务网站上针对目标营销实施行为分析。基本思路如下(我假设使用MongoDB,但期待其他建议):

  • 每个网站Category都有一个关联的tags列表,
  • 每个内容Article也有一个tags
  • 列表
  • 每次User都有第一次访问时分配给他/她的唯一Cookie ID
  • 每次用户浏览Category或读取Article时,我们都会计划增加User-tag字典,如下所示:

    db.tagviews.update(
        {_id: user_id},
        {$inc: {'tags.foo': 1, 'tags.bar': 1, 'tags.baz': 1}},
        true /* upsert */
    )
    

因此,如果我们想要了解特定用户的兴趣,我们可以为他提取tagviews文档,并查看tags以查看哪些文档的观看次数最多。

然而,我偶然发现了一个非常微不足道的事情 - 如何根据标签标准获取用户。例如。我们以极具吸引力的价格购买了Google Galaxy Nexus,并希望向最感兴趣的[android, phones, gadgets, google]用户发送营销电子邮件。

据我了解,我们必须在tagviews集合中的每个tags.*字段上创建索引,这当然是不可接受的。另一种可能的解决方案是在另一个维度中复制数据(递增标记用户组合而不是用户标记)。但是,在磁盘空间和灵活性方面,syntetic测试看起来非常没有希望。

根据标签条件,您有效获取最感兴趣的用户的建议是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

从您的示例中我了解到您在tagviews集合中使用标记名称作为键(也称为字段)。

不要这样做,这会让您在需要创建索引时陷入噩梦。而是在标记视图中将标记创建为嵌入式文档

 tagviews{
      _id : 'xxxx',
      tags : [
        {
           name : "foo",
           count : 0
        },
        {
           name : "bar",
           count : 0
        },
        {
           name : "baz",
           count : 0
        }   
      ]

您可以按标记名称对此文档进行有效索引,以便在过滤器中使用

db.tagviews.ensureIndex('tags.name',1)

您可以通过

递增用户的特定标记视图
db.tagviews.update({_id : "userid" , "tags.name":'foo'},{$inc:{"tags.$.count":1}})

当您的用户偶然发现他的兴趣时。

所以对你真正的问题,

  

如何根据标记条件获取用户。例如。我们有谷歌   Galaxy Nexus现货有吸引力的价格,并希望发送   营销电子邮件给最感兴趣的用户[android,phone,   小工具,谷歌]。

您可以像

一样过滤它
 db.tagviews.find({'tags.name':{$in : ['android', 'phones','gadgets','google'] }})

这将检索对上述标签感兴趣的所有用户。

甚至您可以使用计数来过滤最准确的数据

db.tagviews.find({'tags.name':{$in : ['android', 'phones','gadgets','google'] },'tags.count' : {$gt : 0 }})

希望这会有所帮助