Mongodb 将子对象的id与另一个表匹配
我们正在将系统的一部分从MySQL转换为MongoDB,我们的结构思想如下(子集): 广告Mongodb 将子对象的id与另一个表匹配,mongodb,Mongodb,我们正在将系统的一部分从MySQL转换为MongoDB,我们的结构思想如下(子集): 广告 { _id: ObjectId(), campaign: { title: "Some Title", budget: 100, host: "example.com", ads: [{ // Ad 1 here },{ // Ad 2 here
{
_id: ObjectId(),
campaign: {
title: "Some Title",
budget: 100,
host: "example.com",
ads: [{
// Ad 1 here
},{
// Ad 2 here
},{
// Ad 3 here
}]
}
}
{
ad: {
campaignId: ObjectId(),
adId: 1
},
// Other stuff
}
因此,此对象将有一个活动
对象,其中包含诸如:标题、预算、主机等信息。它还将有一个广告
对象数组,其中包含活动中的每个广告
统计数据
{
_id: ObjectId(),
campaign: {
title: "Some Title",
budget: 100,
host: "example.com",
ads: [{
// Ad 1 here
},{
// Ad 2 here
},{
// Ad 3 here
}]
}
}
{
ad: {
campaignId: ObjectId(),
adId: 1
},
// Other stuff
}
这将包含在Ads
集合中找到的每个印象/点击广告的统计信息
由于上述集合中的每个广告都是一个数组,并且集合中的记录都有一个
\u id
,那么将统计数据与特定活动中的特定广告进行匹配的最佳方法是什么?从第一眼看,我看不出将广告嵌入活动的原因。想想玛格丽特·阿斯特(Margaret Astor)这样的人的大规模全球宣传活动,你可能会达到16MB的文档大小限制,而不会有丝毫的嵌入优势。我会用完全不同的模型
活动应包括与特定广告无关的所有内容:
{
_id: new ObjectId(),
customer: "SomeCustomerReference"
}
个人广告(我假设横幅)应该是这样的:
{
campaign: Ref("SomeCampaignId"),
someInfo: "Awesome product from Acme!"
...
}
所以,我们已经清理了这个。现在,让我们来看看统计数字。首先,您可以向上述添加添加一个计数器,并在此计数器上使用。然而,这并不是很精细。因此,我会为每个印象使用第三个系列
{
_id: ObjectId(),
ad: Ref("Ad"),
impression: new ISODate(),
location: "http://awesome.cool/",
}
现在,点击广告时,您所要做的就是更新印象:
db.impressions.update(
{ _id: "SomeIdDerivedFromReferralCode" },
{ $set: { clicked: new ISODate() } }
)
最后但并非最不重要的一点是,您可以使用和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:
你可以确定一天中哪个时间和一周中哪一天点击次数最多/最少,去年12月24日点击了多少广告等等
因为我们没有使用嵌入式文档或数组,所以这个模型扩展得非常好。没有机会达到16MB文档大小限制,没有频繁的文档迁移,因为成员添加到了大型阵列。从第一眼看,我看不出为什么要将广告嵌入到活动中。想想玛格丽特·阿斯特(Margaret Astor)这样的人的大规模全球宣传活动,你可能会达到16MB的文档大小限制,而不会有丝毫的嵌入优势。我会用完全不同的模型 活动应包括与特定广告无关的所有内容:
{
_id: new ObjectId(),
customer: "SomeCustomerReference"
}
个人广告(我假设横幅)应该是这样的:
{
campaign: Ref("SomeCampaignId"),
someInfo: "Awesome product from Acme!"
...
}
所以,我们已经清理了这个。现在,让我们来看看统计数字。首先,您可以向上述添加添加一个计数器,并在此计数器上使用。然而,这并不是很精细。因此,我会为每个印象使用第三个系列
{
_id: ObjectId(),
ad: Ref("Ad"),
impression: new ISODate(),
location: "http://awesome.cool/",
}
现在,点击广告时,您所要做的就是更新印象:
db.impressions.update(
{ _id: "SomeIdDerivedFromReferralCode" },
{ $set: { clicked: new ISODate() } }
)
最后但并非最不重要的一点是,您可以使用和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:
你可以确定一天中哪个时间和一周中哪一天点击次数最多/最少,去年12月24日点击了多少广告等等
因为我们没有使用嵌入式文档或数组,所以这个模型扩展得非常好。没有机会达到16MB文档大小限制,没有频繁的文档迁移,因为成员添加到了大型阵列。从第一眼看,我看不出为什么要将广告嵌入到活动中。想想玛格丽特·阿斯特(Margaret Astor)这样的人的大规模全球宣传活动,你可能会达到16MB的文档大小限制,而不会有丝毫的嵌入优势。我会用完全不同的模型 活动应包括与特定广告无关的所有内容:
{
_id: new ObjectId(),
customer: "SomeCustomerReference"
}
个人广告(我假设横幅)应该是这样的:
{
campaign: Ref("SomeCampaignId"),
someInfo: "Awesome product from Acme!"
...
}
所以,我们已经清理了这个。现在,让我们来看看统计数字。首先,您可以向上述添加添加一个计数器,并在此计数器上使用。然而,这并不是很精细。因此,我会为每个印象使用第三个系列
{
_id: ObjectId(),
ad: Ref("Ad"),
impression: new ISODate(),
location: "http://awesome.cool/",
}
现在,点击广告时,您所要做的就是更新印象:
db.impressions.update(
{ _id: "SomeIdDerivedFromReferralCode" },
{ $set: { clicked: new ISODate() } }
)
最后但并非最不重要的一点是,您可以使用和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:
你可以确定一天中哪个时间和一周中哪一天点击次数最多/最少,去年12月24日点击了多少广告等等
因为我们没有使用嵌入式文档或数组,所以这个模型扩展得非常好。没有机会达到16MB文档大小限制,没有频繁的文档迁移,因为成员添加到了大型阵列。从第一眼看,我看不出为什么要将广告嵌入到活动中。想想玛格丽特·阿斯特(Margaret Astor)这样的人的大规模全球宣传活动,你可能会达到16MB的文档大小限制,而不会有丝毫的嵌入优势。我会用完全不同的模型 活动应包括与特定广告无关的所有内容:
{
_id: new ObjectId(),
customer: "SomeCustomerReference"
}
个人广告(我假设横幅)应该是这样的:
{
campaign: Ref("SomeCampaignId"),
someInfo: "Awesome product from Acme!"
...
}
所以,我们已经清理了这个。现在,让我们来看看统计数字。首先,您可以向上述添加添加一个计数器,并在此计数器上使用。然而,这并不是很精细。因此,我会为每个印象使用第三个系列
{
_id: ObjectId(),
ad: Ref("Ad"),
impression: new ISODate(),
location: "http://awesome.cool/",
}
现在,点击广告时,您所要做的就是更新印象:
db.impressions.update(
{ _id: "SomeIdDerivedFromReferralCode" },
{ $set: { clicked: new ISODate() } }
)
最后但并非最不重要的一点是,您可以使用和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:
你可以确定一天中哪个时间和一周中哪一天点击次数最多/最少,去年12月24日点击了多少广告等等
因为我们没有使用嵌入式文档或数组,所以这个模型扩展得非常好。没有机会