【问题标题】:MongoDB update sub document array or dictionaryMongoDB 更新子文档数组或字典
【发布时间】:2012-11-29 20:14:34
【问题描述】:

我正在尝试确定以下哪种模式对于使用 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. 给定 user_id 和朋友 id 更新文档,如果朋友 ​​id 存在,则互斥量增加 1,否则添加互斥量为 1 的新朋友
  2. 给定 user_id 和好友 ID 更新文档,如果好友存在且相互计数 > 1,则相互计数减 1,否则从文档中删除好友
  3. 使用 id 列表,在文档中查找以确定存在哪些朋友 id(我知道这是可以在客户端完成的事情,但我对服务器端解决方案感兴趣)
  4. 应该使用哪些索引来加快上述速度?

在我正在进行的工作中,我已经使用模式 1 实现了大部分功能,但现在我开始意识到它可能不如模式 2 合适。但是,对于上述问题,我很难找到最有效的方法。

【问题讨论】:

标签: mongodb pymongo


【解决方案1】:

AFAIK,第 1 点和第 2 点不能在 mongoDB 的单个语句中完成。 您可能必须查询 mongodb 以检查特定的 user_id、friend.id 组合是否存在。 如果确实如此,则更新 else 添加到朋友数组。 参考下面的Javascript代码:

    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);

如果您找到更好的方法,请分享。

【讨论】:

  • 谢谢你,你有关于需求 3 的模式比较的任何信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2017-08-22
  • 2016-11-04
  • 2017-05-28
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多