Mongo DB问题与findOne查询

时间:2016-04-25 12:08:27

标签: mysql mongodb

我正在维护一个房间表,其中包含与会话相关的记录。我希望获得两个用户之间的房间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
}

2 个答案:

答案 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' } },
])
  1. 创建id与会话ID匹配的列表和包含所有userIds的类型数组字段($ group stage)
  2. 过滤掉所有条目,其中用户数组包含您要查找的两个用户的ID。 ($ match stage)
  3. 请记住,这将返回两个用户的所有对话。