Javascript 更新数据库中深度嵌套数据的正确方法是什么

Javascript 更新数据库中深度嵌套数据的正确方法是什么,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有以下数据库结构: { 用户:{ 电邮:example@email.com, 天数:{ 第1天:{ 任务:{ 任务1:{ 名称:“sometask1, 声明:“假” } 任务2:{ 姓名:“sometask2, 声明:“假” } 任务3:{ 姓名:“sometask3, 声明:“假” } ... } ... } } } } 我的模式: //用户模式 const userSchema=new mongoose.Schema{ 电子邮件:String, 密码:String, 用户名:String,

我有以下数据库结构:

{ 用户:{ 电邮:example@email.com, 天数:{ 第1天:{ 任务:{ 任务1:{ 名称:“sometask1, 声明:“假” } 任务2:{ 姓名:“sometask2, 声明:“假” } 任务3:{ 姓名:“sometask3, 声明:“假” } ... } ... } } } } 我的模式:

//用户模式 const userSchema=new mongoose.Schema{ 电子邮件:String, 密码:String, 用户名:String, displayUserName:String, 天数:[{ 类型:对象, 参考:天 }] }; //日模式 const daySchema=newmongoose.Schema{ dayProgress:数字, totalTodos:数字, 任务:[{ 类型:对象, 参考:任务, }] }; //任务secmea const taskSchema=new mongoose.Schema{ 任务名称:{ 类型:字符串, 必填项:true }, 任务时间:{ 类型:日期, 必填项:true }, 任务状态:{ 类型:布尔型, 默认值:false }, 任务类型:{ 类型:对象, 默认值:{} } }; const User=mongoose.model'User',userSchema const Day=mongoose.model'Day',daySchema const Task=mongoose.modelstask,taskSchema 现在让我们假设一个用户想要添加一个新任务。。。更新tasks对象并防止整个数组的覆盖行为的最佳方法是什么

到目前为止,我尝试的是……但它覆盖了整个任务数组:

const task=新任务{ taskName:“测试”, 任务时间:新日期, taskState:false, } 常数日=新的一天{ 每日进度:0, Todos总数:0, 任务:任务 } 常量dayObj={} dayObj['day 1']=天 db.findOneAndUpdate{ 电邮:'example@email.com' }, { $set:dayObj } 我得到的是:

{ 用户:{ 电邮:example@email.com, 天数:{ 第1天:{ 任务:{ 0: { 名称:'测试', 声明:“假” ... } //每次我添加任务时,它都会被覆盖 } } } } } 我要找的是:

{ 用户:{ 电邮:example@email.com, 天数:{ 第1天:{ 任务:{ 测试:{ 名称:'测试', 声明:“假” ... } //我可以把更多的任务推到这里 } } } } } 我知道我应该将值推送到tasks数组或类似的东西,但我不确定该怎么做谢谢您的时间您可以尝试以下查询:使用并推送到确切位置

注意:-我已经手动创建了数据并在下面的查询中进行了测试。我使用了_id和day._id来查找用户和任务需要推送的日期

之前 之后 希望这有帮助

db.update({
  _id: ObjectId("5d51bd5ef5fc3d6486b40ffb"),
  "days._id": ObjectId("5d51bd0ff5fc3d6486b40fe4")
}, {
  $push: {'days.$.tasks': taskData}
});
{
    "_id" : ObjectId("5d51bd5ef5fc3d6486b40ffb"),
    "email" : "kk@kk.com",
    "username" : "KK_KK",
    "displayUserName" : "KK",
    "days" : [ 
        {
            "_id" : ObjectId("5d51bd0ff5fc3d6486b40fe4"),
            "dayProgress" : 1,
            "totalTodos" : 2,
            "tasks" : [ 
                {
                    "_id" : ObjectId("5d51bcdef5fc3d6486b40fd2"),
                    "taskName" : "ABC",
                    "taskState" : false,
                    "taskTypes" : "NEW"
                }
            ]
        }
    ]
}
{
    "_id" : ObjectId("5d51bd5ef5fc3d6486b40ffb"),
    "email" : "kk@kk.com",
    "username" : "KK_KK",
    "displayUserName" : "KK",
    "days" : [ 
        {
            "_id" : ObjectId("5d51bd0ff5fc3d6486b40fe4"),
            "dayProgress" : 1,
            "totalTodos" : 2,
            "tasks" : [ 
                {
                    "_id" : ObjectId("5d51bcdef5fc3d6486b40fd2"),
                    "taskName" : "ABC",
                    "taskState" : false,
                    "taskTypes" : "NEW"
                }, 
                {
                    "taskName" : "ABC1",
                    "taskState" : true,
                    "taskTypes" : "OLD"
                }
            ]
        }
    ]
}