MongoDB将密钥放入$set而不是使用它进行查找?
我正在尝试使用userID作为我的\u id更新消息 将其拆分为findOne-Save-Update是最好的方法吗MongoDB将密钥放入$set而不是使用它进行查找?,mongodb,mongoose,Mongodb,Mongoose,我正在尝试使用userID作为我的\u id更新消息 将其拆分为findOne-Save-Update是最好的方法吗 // // Find and update message // var messageModel = require('../models/messageModel'); var messageTable = mongoose.model('messageModel'); var messageRecord = new messageModel(); var findMessa
//
// Find and update message
//
var messageModel = require('../models/messageModel');
var messageTable = mongoose.model('messageModel');
var messageRecord = new messageModel();
var findMessage = () => {
return new Promise((resolve, reject) => {
console.log("=====START findMessage=====")
messageTable.findOne(
{ _id: userID }
,function(err, data) {
if (err) {
reject(new Error('findMessage: ' + err))
return;
}
// Who will have this as unread?
if (userManager==true) {
messageRecord.readUser = false;
messageRecord.readManager = true;
} else {
messageRecord.readUser = true;
messageRecord.readManager = false;
}
// If message not found, then create new one
if (!data) {
console.log("=====CREATE NEW RECORD=====")
messageRecord._id = userID;
messageRecord.activityDate = Math.round(new Date().getTime()/1000);
messageRecord.messages = {
"message" : message,
"date" : Math.round(new Date().getTime()/1000),
"property" : propertyID,
"booking" : bookingID,
"manager" : userManager
}
messageRecord.save(function (err, res) {
if (err) {
reject(new Error('findMessage: ' + err));
return;
}
})
console.log("=====RESOLVE findMessage=====")
resolve();
return;
}
// If message found, then add message
console.log("=====ADD LINE TO RECORD=====")
messageTable.update (
{ _id: userID },
{
$set: {
activityDate : Math.round(new Date().getTime()/1000),
readUser : messageRecord.readUser,
readManager : messageRecord.readManager
},
$push: {
messages: {
"message" : message,
"date" : Math.round(new Date().getTime()/1000),
"property" : propertyID,
"booking" : bookingID,
"manager" : userManager
}
}
},
{ upsert: true }
).exec(function (err, res) {
if (err) {
reject(new Error('findMessage: ' + err));
return;
}
})
console.log("=====RESOLVE findMessage=====")
resolve();
return;
});
})};
我需要上传吗?(这意味着什么)
或者我应该使用findOneAndUpdate
你会使用findOneAndUpdate还是只更新?为什么
我认为是这样的:
findone
if not found then save
if found then update
更新-多亏了lascot,我最终做到了这一点,而且效果非常好强>
// Save message
messageTable.update (
{ _id: userID },
{
$setOnInsert: {
_id: userID
},
$set: {
activityDate : Math.round(new Date().getTime()/1000),
readUser : messageRecord.readUser,
readManager : messageRecord.readManager
},
$push: {
messages: {
"message" : message,
"date" : Math.round(new Date().getTime()/1000),
"property" : propertyID,
"booking" : bookingID,
"manager" : userManager
}
}
},
{ upsert: true }
).exec(function (err, res) {
if (err) {
reject(new Error('findMessage: ' + err));
return;
}
})
update(条件,{$set:{},$push:{},等等,{upsert:true})
将更新与您的条件匹配的文档,如果没有找到,则创建它们。这就是upsert
的意思,好的!!!因此,如果我只想在找到时更新,那么我应该使用findOneAndUpdate
?我是否也需要upsert:true
来处理这个问题?upsert只有在找到时才会更新。。如果找不到,将创建。。这不是你在上一篇文章中描述的吗:findone->if not found然后save->if found然后update?好的,谢谢@lascort-我仍然不清楚“如果找不到创建”。如果我的代码到达update语句,我不希望创建它。如果找不到,我希望它返回一个错误。然后是常规更新。。在这种情况下,“如果找不到,那么保存”是什么意思?(尽管它不会返回错误)