【问题标题】:MongooseJS populate using multiple target fieldsMongooseJS 使用多个目标字段填充
【发布时间】:2015-01-20 10:31:11
【问题描述】:

我有以下两个架构:

var MessageModel = mongoose.model("message",
    new Schema({
        sender:{type:ObjectId,ref:"user"},
        recipient:{type:ObjectId,ref:"user"},
        title: String
    })
);

var UserModel = mongoose.model("user", 
    new Schema({
        username: String,
        name: String,
        fname: String,
        messages:[{type:ObjectId,ref:"message"}]
    })
);

我在任何地方都找不到的是 mongoose 如何确定从何处获取“消息”填充 - '发件人'字段或'收件人'字段......

是一个吗?两个都?这个可以配置吗? 即我可以创建单独的“incomingMessage”和“outgoingMessages”字段吗?

10 倍。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-populate


    【解决方案1】:

    我不知道我是否理解正确,但无论如何,猫鼬在任何时候都在填充什么是非常清楚的。

    如果您运行Message.find().populate('sender recipient').exec(..),您会得到每个文档,其中senderrecipient 是它们各自的MongoDB 文档。

    如果您运行User.find().populate('messages').exec(..),您将获得一个包含与 ObjectId 匹配的每条消息的数组。根据您的设计,我们无法知道用户是发件人还是收件人。但是如果你事先知道用户的 id,我们可以过滤它:

    User.find().populate({
        path: 'messages',
        match: { sender: userId }
    }).exec(..)
    

    这将返回userId 是发件人的所有邮件。但是消息数组没有填充,这意味着您将只有接收者 ID,但没有其名称,在大多数用例中您可能希望在这些情况下拥有它。因此,现在您必须再次按这些 ID 填充或选择用户。

    但请记住这一点,如果您发现自己一遍又一遍地填充,您必须重新考虑您的设计,否则 MongoDB 可能根本不是正确的解决方案。

    您的设计看起来像是具有关系数据库的背景,不存储冗余信息并遵守数据库规范化规则。但 MongoDB 与关系无关。尽管您可能听起来很奇怪,但请考虑将所需的用户名直接存储在消息对象中。

    您可能会认为,一旦用户更改名称,这种方式的信息就会过时,您是对的。但是,与他写和接收消息的次数相比,用户真正改名的次数有多少。因此,当用户更改他的名字时,最好每隔一段时间更新一次消息模型,而不是一遍又一遍地填充。

    【讨论】:

    • 关于 Mongo 用例的惊人解释。
    • 10 倍。这个问题更多是出于好奇。我同意你所说的大部分内容。我只是想知道如何创建一个填充字段:“incomingMessages”和“outgoingMessages”,其中传入将仅填充以用户为收件人的消息,而传出则以用户为消息发送者。我仍然需要检查它,但猜想你的例子可能有效......
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 2023-03-11
    • 1970-01-01
    • 2015-11-09
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多