一些建议。
图了所有的疑问,你会运行,而所有类型的数据,您将需要存储。例如,你期望在未来增加活动,还是将沙滩和商店全部?
考虑一下你有多少次写操作,哪一次写操作要快一些。
确定你的文件将如何随时间增长,以确保您的模式是在长期的可扩展性。
这是一种可能的方法,如果你只有这两个活动。每个用户每天一个记录。
{ user: "user1",
date: "2012-12-01",
shopped: 0,
beached: 1
}
现在您的查询变得更简单了,无论您是否有两个或十个活动。
当新的活动进来时,你总是必须根据它更新正确的记录。 如果你想你可以只添加一条记录到您的收藏显示用户,日期,活动那么你的刀片是快很多,但是你的查询现在需要做的工作的查询为用户很多,红枣和活动。
拟议架构,这里是插入/更新语句:
db.coll.update({"user":"username", "date": "somedate"}, {"shopped":{$inc:1}}, true)
那是什么说的是:“对somedate用户名加1的逛过属性,创建它,如果它不存在又名"upsert"(这是最后的“真”的说法)。
这里是一个特殊的日子谁做了不止一次活性1以上,但没有做任何活性2的所有用户的查询。
db.coll.find({"date":"somedate","shopped":0,"danced":{$gt:1}})
请谨慎选择一个文档可以有连续和无限增长的模式。
例如,将日期和活动数组持续增长的用户集合中的所有内容都存储在此问题中。请参阅高亮显示的部分here以解释这一点 - 并记住,大型文档将不断进入您的工作数据集,并且如果它们很大并且其中有大量无用(旧)数据,那将会伤害您的性能应用程序,以及磁盘上的数据碎片。
请记住,您不必将所有数据放入一个集合中。最好是拥有一组具有该用户的固定属性的用户集合,在这些用户集合中跟踪他们拥有的朋友的数量或其他半稳定的信息,并且还有一个user_activity集合,您可以为每个用户每天添加记录他们所做的活动。数据的数量或规范化或非规范化与您将运行的查询类型紧密相关,这就是为什么要弄清楚这些是我提出的第一个建议。
你为什么说你必须在插入前查询?查询什么? –
您是否也了解美元运营商? (“不在”) –
@AsyaKamsky我认为欧普表示,要插入一个动作,首先需要查询正确的用户。 – McGarnagle