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
的每个文档