所以我有这种情况,我想保存一个条件,如果用户"已加入网站入门之旅"。所以我想问的问题不是如何将字段保存到MongoDB,而是我应该使用它使用什么字段类型?
我希望它可以在另一个特定条件下重复使用,例如"已加入广告系列 A"或"已访问特殊页面 B"。现在我有 3 个案例可以查看:
情况1:每个情况只有一个布尔字段:一个字段对应一个条件,例如hasJoinedNewOnboarding: true
或hasJoinedCampaignA: 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: ... } ] }