2012-11-29 27 views
2

我想確定下列哪個模式對於用mongodb實現是最有效的。我需要跟蹤朋友ID的&共同的朋友計數系統中的每個用戶(user_id在整個集合中是唯一的)。朋友的數量可能高達100,000。MongoDB更新子文檔數組或字典

模式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存在增量互助,否則添加新的好友與給定爲user_id和朋友id更新,如果朋友存在這樣的文件1
  2. 一個互助和互相計數> 1,然後減少互相計數1,否則從文檔中刪除朋友
  3. 使用id列表,在文檔中查找以確定哪些朋友ID存在(我知道這是可以在客戶端完成的事情,但是對服務器端解決方案感興趣)
  4. 應該使用哪些索引來加速上述過程?

在我正在進行的工作我已經實現了很多這與模式1,但我現在開始認識到作爲模式2。但是,我無法找到的最有效的方法可能不適合作爲以上問題。

+0

由於Google的最佳結果,我偶然發現了這篇文章。我將在此留給任何其他人在將來搜索:http://docs.mongodb.org/manual/core/update/#update-an-element-without-specifying-its-position –

回答

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

PLS份額,如果你找到一個更好的方式來做到這一點。

+0

感謝你的,你有沒有關於需求3的模式比較的任何信息? –