Arrays 如何使用mongoose更新数组中对象的属性
因此,我有一个消息线程,它引用了一堆消息Arrays 如何使用mongoose更新数组中对象的属性,arrays,node.js,angular,mongoose,positional-operator,Arrays,Node.js,Angular,Mongoose,Positional Operator,因此,我有一个消息线程,它引用了一堆消息 var messageThreadSchema = new Schema({ chatBetween: [{ type: Schema.Types.ObjectId, ref: 'User' }], messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }], lastMessage: {type: String} }) 因此,我有一个消息模式 var messageS
var messageThreadSchema = new Schema({
chatBetween: [{ type: Schema.Types.ObjectId, ref: 'User' }],
messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }],
lastMessage: {type: String}
})
因此,我有一个消息模式
var messageSchema = new Schema({
sender: { type: Schema.Types.ObjectId, ref: 'User' },
reciever: { type: Schema.Types.ObjectId, ref: 'User' },
sentAt: { type: Date, default: Date.now },
text: String,
isRead: { type: Boolean, default: false }
})
我在通过消息线程更新消息时遇到问题。isRead我需要更新messageThread中所有消息的isRead属性
我试过: 一, 二, 三, 然后我决定手动更新isRead。我的意思是:
MessageThread.findById(req.body._id)
.populate({ path: "messages" })
.exec((err, foundMessageThread) => {
var updatedMessage = foundMessageThread.messages.map(message=>{
return {...message, isRead:true}
})
var newThread = {...foundMessageThread,
messages: [...foundMessageThread.messages, ...updatedMessage]}
newThread.save()
});
当然,它在节点中不起作用。所以我不得不使用Object.assign()重做所有的事情,这使得我的代码更加混乱((
我的问题:
能否将
messageThread.\u id
和消息传递给函数,找到messageThread
,然后findbyiandupdate
找到message
?您正在尝试更新与正在运行更新的集合不同的集合。Mongodb更新仅适用于单个集合中的数据。正确的方法是我们应该分别管理关系并保持它们的同步。这会为您清理问题。它是用于删除的,但概念类似。@ChauTran,你是对的,我可以搜索消息。\u id
并更改isRead
,但我认为这会对性能产生负面影响。因为,可能会有数百万条消息这与用户无关。我说得对吗?@Veeram,我想我没法理解你。你能澄清一下吗?当谈到这个例子时,它解释得很好,但我找不到与我的案例的关系。我的意思是,在我的案例中,我不想更新messageThread
,而是通过填充它,我想得到message
来更新它们。呵呵我可以在不搜索数百万条消息的情况下更新它们吗?正如您的messageSchema
所示,一个messageThread
只属于两个正在通信的用户,不是吗?您只能flagRead
到message.receiver==currentUser.id&&!message.isRead
,您可以在客户端使用另一个ser进行检查获取currentUser
的副作用。我认为这不会破坏您的性能,最多也不足以引起注意。messageThread
的消息是messageId
的数组,因此除非您实现删除消息,否则您实际上不需要在此处进行任何修改。
MessageThread.update({'_id': req.body._id},
{'$set': {
"messages.$.isRead": true
}},
function(err,model) {
if(err){
console.log(err);
return res.send(err);
}
return res.json(model);
});
MessageThread.findById(req.body._id)
.populate({ path: "messages" })
.exec((err, foundMessageThread) => {
var updatedMessage = foundMessageThread.messages.map(message=>{
return {...message, isRead:true}
})
var newThread = {...foundMessageThread,
messages: [...foundMessageThread.messages, ...updatedMessage]}
newThread.save()
});