我正在维护一个房间表,其中包含与会话相关的记录。我希望获得两个用户之间的房间ID,因此使用findOne
查询,但它带来了其他记录而不满足我的需求。
建议我查询出错的地方。
如果我提出查询:
rooms.findOne({ "userId" :"800", "userId" :"600"});
我期待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 :(得分:4)
您必须使用聚合来执行此操作。
rooms.aggregate([
{ $group: { _id: '$conversationId', users: { $push: '$userId' } } },
{ $match: { users: { $all: ['800', '600'] }, groupType: 'PRIVATE' } },
])

答案 1 :(得分:1)
findOne()操作根据反映磁盘上文档顺序的自然顺序返回第一个文档,请参阅mongodb docs。
其次,您作为findOne()
操作的参数提供的查询文档包含userId
的两个值,这与$in operator不同。后一个优先于第一个。
正如Mathieu建议的那样,正确的查找是使用聚合管道,包括两个步骤:
rooms.aggregate([
{ $group: { _id: '$conversationId', users: { $push: '$userId' } } },
{ $match: { users: { $all: ['800', '600'] }, groupType: 'PRIVATE' } },
])
请记住,这将返回两个用户的所有对话。