首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将子对象的id与另一个表匹配

问将子对象的id与另一个表匹配
EN

Stack Overflow用户
提问于 2015-04-21 03:57:48
回答 1查看 144关注 0票数 0

我们正在将系统的一部分从MySQL转换为MongoDB,我们的结构思路如下(子集):

Ads

代码语言:javascript
复制
{
    _id: ObjectId(),
    campaign: {
        title: "Some Title",
        budget: 100,
        host: "example.com",
        ads: [{
            // Ad 1 here
        },{
            // Ad 2 here
        },{
            // Ad 3 here
        }]
    }
}

因此,这个对象将有一个campaign对象,包含诸如:标题、预算、主机等信息。它还将有一个ads对象数组,其中包含活动中的每个广告。

统计

代码语言:javascript
复制
{
    ad: {
        campaignId: ObjectId(),
        adId: 1
    },
    // Other stuff
}

这将包含每个印象的统计信息/点击在Ads集合中找到的广告

由于上述集合中的每个广告都是一个数组,而且集合中的记录有一个_id,那么在特定的活动中将统计数据与特定广告相匹配的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-21 04:51:00

从第一次看,我看不出有什么理由把广告嵌入到竞选活动中。想想像玛格丽特·阿斯托这样的人的大规模全球性活动吧--你可能会达到16 of的文档大小限制,而不会有丝毫的嵌入优势。我会做完全不同的模特。

宣传活动应包括与某一特定广告无关的所有内容:

代码语言:javascript
复制
{
  _id: new ObjectId(),
  customer: "SomeCustomerReference"
}

个别广告(我想是横幅)应该是这样的:

代码语言:javascript
复制
{
  campaign: Ref("SomeCampaignId"),
  someInfo: "Awesome product from Acme!"
  ...
}

所以,我们已经清理好了。现在来看一下统计数字。首先,您可以在上面添加一个计数器,并在此计数器上使用$inc算子。然而,这并不是很粒状的。所以我会用第三个收藏来形容每一个印象

代码语言:javascript
复制
{
  _id: ObjectId(),
  ad: Ref("Ad"),
  impression: new ISODate(),
  location: "http://awesome.cool/",
}

现在,当你点击广告时,你要做的就是更新你的印象:

代码语言:javascript
复制
db.impressions.update(
  { _id: "SomeIdDerivedFromReferralCode" },
  { $set: { clicked: new ISODate() } }
)

最后但并非最不重要的一点是,您可以使用聚合框架和其他一些方法从这个简单的结构中获取大量信息。一个简单的例子是计算广告“foo”的点击印象:

代码语言:javascript
复制
db.impressions.find({ ad:"foo", clicked:{ $exists: true } } ).count()

你可以确定一天中哪一天和哪一天发生最多/最少的点击次数,去年12月24日点击了多少广告等等。

由于我们没有使用嵌入式文档或数组,这个模型扩展得非常好。没有机会接触到16 of的文档大小限制,也没有频繁的文档迁移,因为成员添加到大数组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29762631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档