我正在尝试在我的电子商务网站上针对目标营销实施行为分析。基本思路如下(我假设使用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测试看起来非常没有希望。
根据标签条件,您有效获取最感兴趣的用户的建议是什么?
谢谢!
答案 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 }})
希望这会有所帮助