Node.js MongooseJS使用多个目标字段进行填充

Node.js MongooseJS使用多个目标字段进行填充,node.js,mongodb,mongoose,mongoose-populate,Node.js,Mongodb,Mongoose,Mongoose Populate,我有以下两种模式: 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({

我有以下两种模式:

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如何确定从哪里获取填充的“消息”-“发件人”字段或“收件人”字段

是一个吗?二者都这可以配置吗? i、 e.我是否可以创建单独的“incomingMessage”和“outgoingMessages”字段,以及如何创建


10倍。

我不知道我是否正确理解这一点,但无论如何,很清楚猫鼬在任何时候都在繁殖什么

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

如果运行
User.find().populate('messages').exec(..)
,则会得到与ObjectId匹配的每条消息的数组。根据您的设计,我们无法知道用户是发件人还是收件人。但如果您事先知道用户的id,我们可以对其进行筛选:

User.find().populate({
    path: 'messages',
    match: { sender: userId }
}).exec(..)
这将返回
userId
为发件人的所有消息。然而,messages数组反过来没有填充,这意味着您将只有receivers id,而没有它的名称,在大多数情况下,您可能希望在这些情况下使用它。因此,现在您必须再次通过这些ID填充或选择用户

但是记住这一点,如果你发现自己一次又一次地流行,你必须重新考虑你的设计,否则MongoDB可能不是正确的解决方案

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


您可能会认为,这样一来,一旦用户更改其名称,信息就会过时,您是对的。但与用户编写和接收消息的次数相比,用户真正更改了多少次自己的姓名。因此,与其一次又一次地更新消息模型,不如在用户更改其姓名时更新消息模型。

我不知道我是否正确理解这一点,但无论如何,很清楚Mongoose在任何时候都在填充什么

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

如果运行
User.find().populate('messages').exec(..)
,则会得到与ObjectId匹配的每条消息的数组。根据您的设计,我们无法知道用户是发件人还是收件人。但如果您事先知道用户的id,我们可以对其进行筛选:

User.find().populate({
    path: 'messages',
    match: { sender: userId }
}).exec(..)
这将返回
userId
为发件人的所有消息。然而,messages数组反过来没有填充,这意味着您将只有receivers id,而没有它的名称,在大多数情况下,您可能希望在这些情况下使用它。因此,现在您必须再次通过这些ID填充或选择用户

但是记住这一点,如果你发现自己一次又一次地流行,你必须重新考虑你的设计,否则MongoDB可能不是正确的解决方案

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


您可能会认为,这样一来,一旦用户更改其名称,信息就会过时,您是对的。但与用户编写和接收消息的次数相比,用户真正更改了多少次自己的姓名。因此,与其一次又一次地更新消息模型,不如在用户更改其姓名时更新消息模型。

我不知道我是否正确理解这一点,但无论如何,很清楚Mongoose在任何时候都在填充什么

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

如果运行
User.find().populate('messages').exec(..)
,则会得到与ObjectId匹配的每条消息的数组。根据您的设计,我们无法知道用户是发件人还是收件人。但如果您事先知道用户的id,我们可以对其进行筛选:

User.find().populate({
    path: 'messages',
    match: { sender: userId }
}).exec(..)
这将返回
userId
为发件人的所有消息。然而,messages数组反过来没有填充,这意味着您将只有receivers id,而没有它的名称,在大多数情况下,您可能希望在这些情况下使用它。因此,现在您必须再次通过这些ID填充或选择用户

但是记住这一点,如果你发现自己一次又一次地流行,你必须重新考虑你的设计,否则MongoDB可能不是正确的解决方案

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


您可能会认为,这样一来,一旦用户更改其名称,信息就会过时,您是对的。但与用户编写和接收消息的次数相比,用户真正更改了多少次自己的姓名。因此,与其一次又一次地更新消息模型,不如在用户更改其姓名时更新消息模型。

我不知道我是否正确理解这一点,但无论如何,很清楚Mongoose在任何时候都在填充什么

如果运行
Message.find().populate('sender-recipient').exec(..)
,您将获得带有
sender
recipient
的每个文档