MongoDB将密钥放入$set而不是使用它进行查找?

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

我正在尝试使用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 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语句,我不希望创建它。如果找不到,我希望它返回一个错误。然后是常规更新。。在这种情况下,“如果找不到,那么保存”是什么意思?(尽管它不会返回错误)