2013-11-02 67 views
1

我有收集朋友想法如何查詢兩個集合MongoDB中

- userId: user id 
- Friends: array of user ids 

而且用戶

- _id: userId 
- Last Login 
- Other User info fields 

上次登錄字段,如果用戶在瀏覽我的網站每5分鐘更新一次。

現在我有邏輯從哪裏獲得的用戶ID從朋友朋友集合,然後查詢用戶收集與IDS獲取用戶信息。

補充:除了在未來的版本我想補充一點,用戶將能夠從其他集合添加好友,不僅用戶,而且寵物等等朋友嵌入式陣列看起來像{用戶ID,PetId}

但對於下一個版本我想添加新的功能,以顯示按上次登錄排序的朋友。

解決方案,我認爲會的工作

  1. 地圖減少選擇 - 易於實現,但很可能有性能問題
  2. 地圖減輕更新 - 在這種情況下,我可能會使用屬性「走出去」在每個更新上寫新的集合,所以然後我將有新的集合Friend.reduced與我需要的所有信息,然後我可以很容易地查詢它索引
  3. 添加新屬性最後更新爲朋友列表集合,所以它會看起來像{FriendId,LastUpdate}邏輯將是e在業務層面上實施。

還有什麼其他選擇來解決我的問題?

回答

1

像下面這樣簡單的查詢將不起作用嗎?

var someId = ObjectId("52758653cbd6ca816ca0ee1b") 
var friends = db.friends.findOne({"userId": someId}, {"_id": 0, "friends": 1}).friends 

db.users.find(
    {_id: {$in: friends }} 
).sort({lastLogin: -1}) 
+0

那麼它也和想法,但最複雜的是,在我的項目中,朋友不僅是用戶:)他們也將是寵物。 :) –

+0

嗯,我只是想,但可能這個解決方案將工作,因爲寵物擁有者和這個所有者是用戶ID,所以朋友陣列將有對象{UserId,PetId - 這將是空的}然後,我可以輕鬆排序,並仍然如果朋友被添加爲寵物,我會得到關於寵物的信息。 –

+0

你可否在問題中加入一些細節。它看起來像一個簡單的查詢工作,並不清楚爲什麼你想要map-reduce。 – zero323