我们正在将系统的一部分从MySQL转换为MongoDB,我们的结构思路如下(子集):
Ads
{
_id: ObjectId(),
campaign: {
title: "Some Title",
budget: 100,
host: "example.com",
ads: [{
// Ad 1 here
},{
// Ad 2 here
},{
// Ad 3 here
}]
}
}因此,这个对象将有一个campaign对象,包含诸如:标题、预算、主机等信息。它还将有一个ads对象数组,其中包含活动中的每个广告。
统计
{
ad: {
campaignId: ObjectId(),
adId: 1
},
// Other stuff
}这将包含每个印象的统计信息/点击在Ads集合中找到的广告
由于上述集合中的每个广告都是一个数组,而且集合中的记录有一个_id,那么在特定的活动中将统计数据与特定广告相匹配的最佳方法是什么?
发布于 2015-04-21 04:51:00
从第一次看,我看不出有什么理由把广告嵌入到竞选活动中。想想像玛格丽特·阿斯托这样的人的大规模全球性活动吧--你可能会达到16 of的文档大小限制,而不会有丝毫的嵌入优势。我会做完全不同的模特。
宣传活动应包括与某一特定广告无关的所有内容:
{
_id: new ObjectId(),
customer: "SomeCustomerReference"
}个别广告(我想是横幅)应该是这样的:
{
campaign: Ref("SomeCampaignId"),
someInfo: "Awesome product from Acme!"
...
}所以,我们已经清理好了。现在来看一下统计数字。首先,您可以在上面添加一个计数器,并在此计数器上使用$inc算子。然而,这并不是很粒状的。所以我会用第三个收藏来形容每一个印象
{
_id: ObjectId(),
ad: Ref("Ad"),
impression: new ISODate(),
location: "http://awesome.cool/",
}现在,当你点击广告时,你要做的就是更新你的印象:
db.impressions.update(
{ _id: "SomeIdDerivedFromReferralCode" },
{ $set: { clicked: new ISODate() } }
)最后但并非最不重要的一点是,您可以使用聚合框架和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:
db.impressions.find({ ad:"foo", clicked:{ $exists: true } } ).count()你可以确定一天中哪一天和哪一天发生最多/最少的点击次数,去年12月24日点击了多少广告等等。
由于我们没有使用嵌入式文档或数组,这个模型扩展得非常好。没有机会接触到16 of的文档大小限制,也没有频繁的文档迁移,因为成员添加到大数组。
https://stackoverflow.com/questions/29762631
复制相似问题