如何从引用到另一个集合中获取单个值?

时间:2015-03-29 20:20:41

标签: php mongodb

我有两个收藏 - 用户和聊天。每条聊天消息都具有如下结构:

_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。

1 个答案:

答案 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数组参数中元素的顺序返回 - 这通常是预期/期望的,但事实并非如此。