2017-01-16 132 views
0

我正在嘗試創建一個用戶可以觀看項目的監視列表。我試圖通過將監視列表字段添加到我的用戶集合來創建它。監視列表將是與其他項目對應的ID數組。如何檢查數組中的每個項目是否存在

用戶收集:

  • ID:對象ID
  • 名:字符串
  • 監視列表:陣列即[9872,342,4545,234,8745]

我的問題與查詢這個結構有關。我希望能夠在傳遞用戶ID和〜20個ID的數組的情況下編寫查詢,並檢查用戶觀看哪些ID(即哪些ID存在於該用戶的監視列表字段中)。

我最初嘗試這樣的:

db.users.find({ 
    _id: 507c35dd8fada716c89d0013, 
    watchlist: { $in: [342, 999, 8745, etc...] } 
}); 

但是這給了我任何包含這些監視列表項目,這是不是我想要的用戶列表。我真正想要的是包含這樣的一個陣列的響應:

{ 
    id: 342, 
    exists: true 
}, 
{ 
    id: 999, 
    exists: false 
}, 
{ 
    id: 8745, 
    exists: true 
} 

我想甚至可以確定剛開匹配項目的數組:

{ 
    _id: 507c35dd8fada716c89d0013, 
    watching: [342, 8745] 
} 

這是可行的,否則我會最好將監視列表移動到一個單獨的集合中,並將用戶作爲一個數組來移動(我對後一種方法的關注是用戶只能看幾百個項目,但成千上萬的用戶可能會看到相同的項目。)

+0

嘗試顛倒它。嘗試在每個監視列表上存儲用戶標識列表,並查詢監視列表是否存在給定的用戶標識 –

回答

0

您可以使用$ setIntersection運算符輕鬆實現第二個輸出。

db.users.aggregate(
    [ {$match:{"_id": 507c35dd8fada716c89d0013}}, 
    { $project: { "watching": { $setIntersection: [ "$watchlist", [ 342, 999, 8745 ] ] } } } 
    ] 
) 
相關問題