【问题标题】:Mongoose.findOneAndUpdate() is not creating new documentMongoose.findOneAndUpdate() 没有创建新文档
【发布时间】:2017-05-06 14:56:55
【问题描述】:

当客户端提供新的 WEEKNUM 时,mongoose.findOneAndUpdate() 方法不会创建新对象。相反,它只是更新集合中已经存在的 WEEKNUM 和 WEEKDATA。我该如何解决?我在这里错过了什么?

架构:

{
    ageGroup:String,
    monthData: [{
    month:String,
    circleTimeWordsList:[String],
    circleTimeTips:[String],

    weekData : [{
        weekNum : String,
        theme   : String,

        dayData: [{
            day:String,
            circleTimeSong: String,
            circleTimeBook: String,
            circleTimeActivity: String,

            learningCenter: [{
                learningCenterName:String,
                learningCenterActivity:String 
            }]
        }]
    }]
}]
}

这是我的架构。我正在使用 mongoose.findOneAndUpdate() 插入/更新集合中的数据。

例如。

  1. 如果我们在集合中没有任何内容。数据将被插入。
  2. 如果我们的集合中已经有以下数据。

    {
        ageGroup:"2",
        monthData: {
        month:"January",
        circleTimeWordsList:["word 1", "word 2"],
        circleTimeTips:["teaching tips", "teaching tips 2"],
    
        weekData : {
            weekNum : "1",
            theme   : "circleTime theme weekly 1",
    
            dayData: [{
                day:"Monday",
                circleTimeSong: "circleTimeSong 1", 
                circleTimeBook: "english 1", 
                circleTimeActivity: "circleTimeActivity 1", 
    
                learningCenter: [{
                    learningCenterName:"Art Center",
                    learningCenterActivity:"learningCenterActivity 1" 
                },
                {
                    learningCenterName:"Language Center",
                    learningCenterActivity:"learningCenterActivity 1"
                }]
            }]
        }
    }
    

    }

如果客户端将以下 JSON 发送到服务器,

{
        ageGroup:"2",
        monthData: {
        month:"January",
        circleTimeWordsList:["word 1", "word 2"],
        circleTimeTips:["teaching tips", "teaching tips 2"],

        weekData : {
            weekNum : "2",
            theme   : "circleTime theme weekly 2",

            dayData: [{
                day:"Monday",
                circleTimeSong: "circleTimeSong 2", 
                circleTimeBook: "english 2", 
                circleTimeActivity: "circleTimeActivity 2", 

                learningCenter: [{
                    learningCenterName:"Art Center",
                    learningCenterActivity:"learningCenterActivity 2" 
                },
                {
                    learningCenterName:"Language Center",
                    learningCenterActivity:"learningCenterActivity 2"
                }]
            }]
        }
    }
}

mongodb 集合将如下所示:

{
        ageGroup:"2",
        monthData: {
        month:"January",
        circleTimeWordsList:["word 1", "word 2"],
        circleTimeTips:["teaching tips", "teaching tips 2"],

        weekData : [
                {
                    weekNum : "1",
                    theme   : "circleTime theme weekly 1",

                    dayData: [{
                        day:"Monday",
                        circleTimeSong: "circleTimeSong 1", 
                        circleTimeBook: "english 1", 
                        circleTimeActivity: "circleTimeActivity 1", 

                        learningCenter: [{
                            learningCenterName:"Art Center",
                            learningCenterActivity:"learningCenterActivity 1" 
                        },
                        {
                            learningCenterName:"Language Center",
                            learningCenterActivity:"learningCenterActivity 1"
                    }]
                },

                {
                    weekNum : "2",
                    theme   : "circleTime theme weekly 2",

                    dayData: [{
                        day:"Monday",
                        circleTimeSong: "circleTimeSong 2", 
                        circleTimeBook: "english 2", 
                        circleTimeActivity: "circleTimeActivity 2", 

                        learningCenter: [{
                            learningCenterName:"Art Center",
                            learningCenterActivity:"learningCenterActivity 2" 
                        },
                        {
                            learningCenterName:"Language Center",
                            learningCenterActivity:"learningCenterActivity 2"
                        }]
                    }]
                }
            ]
        }
    }
}

但是当前代码只是更新旧数据,而不是在 WEEKDATA 数组中为第 2 周创建单独的对象

这是我正在使用的代码:

MyData.getMyDataModelObject().findOneAndUpdate({ageGroup:data.ageGroup, month:data.monthData.month/*, weekNum:data.monthData.weekData.weekNum*/}, data, {upsert:true}, function(err, foundData){});

【问题讨论】:

  • findOneAndUpdate 更新整个文档。您显然想要的是添加或更新一个 sub 文档。在这里阅读:mongoosejs.com/docs/subdocs.html。如果您需要经常执行此类更新,可能值得重新设计您的架构。

标签: javascript node.js mongodb mean-stack


【解决方案1】:

假设请求进入正文

var data=req.body;
delete data.weekData;
findOneAndUpdate(query,data,function(err,model){
  if(err){
// handle here
    }
 model.monthData.weekData.push(req.body.weekData);
 model.save();
});

var data=req.body;
    findOneAndUpdate(query,{$push:{"weekData":data.weekData},function(err,model){
      if(err){
    // handle here
        }      
    });
     delete data.weekData;
     findOneAndUpdate(query,data,function(err,model){

      });

在此使用 mongoose 中的子文档,您必须更改您的架构,但如果您执行 CRUD 操作,这是更好的选择
链接subdocuments

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多