我有两个收藏 - 用户和聊天。每条聊天消息都具有如下结构:
_id: ObjectId
from: ObjectId // user _id
to: ObjectId // user _id
message: String
date_created: Date
每个用户都有:
_id: ObjectId
name: String
username: String
// ... not important stuff
我需要获取仅发送给我的会话,结果应采用以下方式:
{
data: [
{
"id": conversation_id,
"title": username,
"message": message_excerpt
},...
]
}
我的问题是尝试从引用中获取用户名,因为我不想进行20次获取查询以获得20个不同的用户名。我会在首次创建对话时添加用户名,但我不能,因为用户名可以随时更改。这将在用户名和会话标题之间产生不一致。我该如何处理这个问题?这是我第一次希望Mongo有一个JOIN。
答案 0 :(得分:0)
两种可能性:
1:将用户名添加到聊天消息文档中。如您所说,如果用户名更改,您需要更改所有用户聊天的用户名。
2:进行应用程序级联接。您不需要进行20次查询即可获得20个名称。您可以先检索所有聊天记录,然后收集所有user_id
值并进行一次查询。例如:
var results = [
{ "_id" : 0, "from" : 43, "to" : 86, "message" : "sup?" },
{ "_id" : 1, "from" : 99, "to" : 86, "message" : "yo" }
]
var from_users = db.users.find({ "_id" : { "$in" : results.map(function(doc) { return doc.from }) } }).toArray()
现在,您可以使用from_users
将用户名填充到results
或创建所需的文档结构。请注意,$in
的结果必须按照$in
数组参数中元素的顺序返回 - 这通常是预期/期望的,但事实并非如此。