我正在尝试使用mongodb来确定以下哪个模式最有效。我需要跟踪朋友ID和&共同的朋友计算系统中的每个用户(user_id在整个集合中是唯一的)。朋友的数量可能高达100,000。
架构1
{
“_id” : “…”,
“user_id” : “1”,
friends : {
“2” : {
“id” : “2”,
“mutuals” : 3
}
“3” : {
“id” : “3”,
“mutuals”: “1”
}
“4” : {
“id” : “4”,
“mutuals”: “5”
}
}
}
架构2
{
“_id” : “…”,
“user_id” : “1”,
friends : [
{
“id” : “2”,
“mutuals” : 3
},
{
“id” : “3”,
“mutuals”: 1
},
{
“id” : “4”,
“mutuals”: 5
}
]
}
要求:
在我正在进行的工作中,我已经使用模式1实现了大部分内容,但现在我开始意识到它可能不如模式2那么合适。但是,我无法找到上述问题的最有效方法。
答案 0 :(得分:1)
AFAIK,分1& 2不能在mongoDB中的单个语句中完成。 您可能需要查询mongodb以检查特定的user_id,friend.id组合是否存在。 如果确实如此,则更新其他添加到好友阵列。 请参阅下面的JavaSscript代码:
use <dbname>;
var FriendsList;
var FriendId = "9";
var UserId = "1";
var Friends = db.Friends.findOne({"user_id":UserId, "friends.id":FriendId});
if (Friends != null){
print ("Friends is not null");
FriendsList = Friends.friends;
// print (FriendsList.toSource());
for (var i = 0; i < FriendsList.length; i++){
var curFriend = FriendsList[i];
if (curFriend["id"] == FriendId){
curFriend["mutuals"] = curFriend["mutuals"] + 1;
FriendsList[i] = curFriend;
break;
}
}
}
if (Friends == null){
print ("Friends is null");
Friends = db.Friends.findOne({"user_id":UserId});
FriendsList = Friends.friends;
FriendsList.push({"id":FriendId, "mutuals":1});
// print (FriendsList.toSource());
}
Friends.friends = FriendsList;
db.Friends.save(Friends);
如果您找到更好的方法,请分享。