2016-04-25 82 views
1

我維護一個房間表,它由與會話相關的記錄組成。我想獲得兩個用戶之間的房間ID,所以使用findOne查詢,但它帶來了其他記錄,並不能滿足我的需要。 建議我查詢出錯的地方。MongoDB問題與findOne查詢

如果我給查詢: rooms.findOne({ "userId" :"800", "userId" :"600"}); 我expectng的fsny11z742kpgb9對話ID,但是它給6puebew70kke29

{ 
    "_id": ObjectId("571c5724db62826826d28d08"), 
    "conversationId": "6puebew70kke29", 
    "userId": "600", 
    "firstName": "Test", 
    "profileImagePath": "", 
    "created": ISODate("2016-04-24T05:18:28.753Z"), 
    "__v": 0 
} 
{ 
    "_id": ObjectId("571c5724db62826826d28d09"), 
    "conversationId": "6puebew70kke29", 
    "userId": "900", 
    "firstName": "User", 
    "profileImagePath": "", 
    "created": ISODate("2016-04-24T05:18:28.754Z"), 
    "__v": 0 
} 

{ 
    "_id": ObjectId("571c574edb62826826d28d0b"), 
    "conversationId": "fsny11z742kpgb9", 
    "userId": "600", 
    "firstName": "FitTest", 
    "profileImagePath": "", 
    "created": ISODate("2016-04-24T05:19:10.192Z"), 
    "__v": 0 
} 

{ 
    "_id": ObjectId("571c574edb62826826d28d0c"), 
    "conversationId": "fsny11z742kpgb9", 
    "userId": "800", 
    "firstName": "Dev", 
    "profileImagePath": "", 
    "created": ISODate("2016-04-24T05:19:10.193Z"), 
    "__v": 0 
} 
+0

在查詢中,爲什麼要編寫兩次UserID? –

+0

數據中似乎沒有任何'類型'字段。所以我想知道爲什麼一個帶有'type'的查詢:'PRIVATE'返回一些東西。 –

+0

我想convesationID這涉及兩個用戶tats爲什麼給userId兩次 – Karthik

回答

4

您必須使用聚合來完成此操作。

rooms.aggregate([ 
 
    { $group: { _id: '$conversationId', users: { $push: '$userId' } } }, 
 
    { $match: { users: { $all: ['800', '600'] }, groupType: 'PRIVATE' } }, 
 
])

+0

這個。我相信你應該聚合,以便這兩個UserId的匹配。 –

+0

@MathieuLordon:假設我有一個羣組類型private或group,無論如何要添加像groupType這樣的另一個字段:'PRIVATE'那樣? – Karthik

+0

我編輯了我的帖子以僅匹配私人對話。爲了獲得更好的性能,您還可以在$ group階段之前按groupType進行過濾(當然,在groupType上有一個索引)。 –

1

的findOne()操作返回根據反映的磁盤上的文件的順序的自然順序的第一個文檔,見mongodb docs

其次,作爲findOne()操作的參數提供的查詢文檔包含userId的兩個值,這與$in operator不一樣。後者覆蓋第一個。

如馬修建議的,一個適當的查找將是使用一個聚合管道有兩個步驟:

rooms.aggregate([ 
    { $group: { _id: '$conversationId', users: { $push: '$userId' } } }, 
    { $match: { users: { $all: ['800', '600'] }, groupType: 'PRIVATE' } }, 
]) 
  1. 創建具有ID相匹配的會話ID和類型的陣列包含所有的用戶id字段列表( $ group stage)
  2. 篩選出所有條目,其中用戶數組包含您正在查找的兩個用戶的ID。 ($ match stage)

請記住,這將返回所有這兩個用戶的對話。