保存条件 用户是否在MongoDB中做了什么:我应该使用哪种字段类型?



所以我有这种情况,我想保存一个条件,如果用户"已加入网站入门之旅"。所以我想问的问题不是如何将字段保存到MongoDB,而是我应该使用它使用什么字段类型?

我希望它可以在另一个特定条件下重复使用,例如"已加入广告系列 A"或"已访问特殊页面 B"。现在我有 3 个案例可以查看:

情况1:每个情况只有一个布尔字段:一个字段对应一个条件,例如hasJoinedNewOnboarding: truehasJoinedCampaignA: false。我需要做的就是按key: true搜索。

情况 2:使用数组:一个数组用于多个条件,例如['hasJoinedNewOnboarding','hasJoinedCampaignA']。假设字段名称为meta_data。我需要做的就是使用像{ meta_data: { $elemMatch: { 'hasJoinedNewOnboarding' } } }这样的$elemMatch进行搜索

情况 3:使用对象:一个对象用于多个条件,例如案例 2:使用数组:一个数组用于多个条件,例如{ hasJoinedNewOnboarding: true, hasJoinedCampaignA: false }。假设字段名称为meta_data。我需要做的就是像{ 'meta_data.hasJoinedNewOnboarding': true }一样搜索它

话虽如此,您认为哪一种是将条件存储在数据库中的最佳方法?还是您心中有什么比这 3 种情况更好的东西?

谢谢

当您要查询数据时,没有太大区别,它始终是:

db.col.find({hasJoinedNewOnboarding: true})

或者对于第二种方法:

db.col.find({arrayName: "hasJoinedNewOnboarding"})

这两种方法都很容易,但是我建议将此类事件存储在数组中,因为当您不需要在MongoDB中引用多个键名时,聚合数据更容易,

例如,如果您有如下文档:

{
events: [
"hasJoinedNewOnboarding",
"hasJoinedCampaignA"
]
}

您可以通过运行以下查询来动态计算有多少用户执行了某些操作:

db.collection.aggregate([
{
$unwind: "$events"
},
{
$group: {
_id: "$events",
count: { $sum: 1 }
}
}
])

蒙戈游乐场

或者,如果您决定使用第一种方法或第三种方法,则事件的名称由MongoDB文档中的键名称表示,因此您仍然可以轻松计算单个事件的发生次数,但是如果要动态分组所有事件,则需要使用$objectToArray运算符变得更加麻烦。

因此,推荐的方法是将它们保留为字符串数组或对象数组,例如:

{ events: [ { eventType: "NewOnboarding", date: ... } ] }

最新更新