如何从对另一个集合的引用中获取单个值


how to fetch a single value from a reference to another collection?

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

_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个fetch查询来获取20个不同的用户名。我本来会在第一次创建对话时添加用户名,但我不能,因为用户名可以随时更改。这将在用户名和会话标题之间产生不一致。我应该如何处理这个问题?这是我第一次希望Mongo中有一个JOIN。

两种可能性:

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——这通常是预期/期望的,但事实并非如此。