繁体   English   中英

猫鼬使用save()方法不会保存文档

[英]document wont save using save() method with mongoose

我有这个架构:

var UserSchema = mongoose.Schema({
    analytic: {
      type: Object, 
      default: {
        today:[],
        weekly:[],
        monthly:[],
        yearly:[],
        allTime:[]
      }
    }
});

let User = mongoose.model("bloger", UserSchema);
module.exports = {User};

我正在尝试将一些数据保存到数组之一中,如下所示:

    User.findOne({username:username}, (e, user) => {
        if (e) {
            res.send('error fetching post')
        }
        else if (!user) {
            res.send('no user found')
        }
        else if (user) {
            user.analytic.today.push(req.body.visitor) // push the data object to the array
            user.save((e, doc) => {
                if (e) {
                    res.send(e)
                } 
                if (doc) {
                     console.log('user saved')
                    res.send(doc)
                }
            })
        }
    })
}) 

我在save()而不是e上获得了doc对象,所以我虽然应该保存它,但事实并非如此。

在此之前,我曾遇到过类似的问题,因为我没有定义新模型,而只是传递了JSON对象。

无需保存对象,您需要创建一个新模型并将其保存。

尝试创建一个新模型,将保存内容传递给它,如下所示;

var newUser = new User(user);
newUser.save((e, doc) {
    if (e) {
       res.send(e)
    } 
    if (doc) {
        console.log('user saved')
        res.send(doc)
    }
});

确保在脚本中需要用户模型。

对不在您架构中的对象执行深层修改会使Mongoose忽略这些更改,从而使其无法知道要保存的内容(以及进行有效的原子更新)。 最终结果是,当调用.save ,Mongoose认为没有任何修改,因此什么也不做。

在您的特定情况下,您有两个选择:

1.将analytics子数组添加到架构

这是最好的选择,可以对所有内容进行更好的控制:

const UserSchema mongoose.Schema({
  analytic: {
    today: [{}],
    weekly: [{}],
    monthly: [{}],
    yearly: [{}],
    allTime: [{}],
  }
});

这样,Mongoose现在就知道了这些数组,并且一切都应该正常工作。

请注意,在这种情况下,您不需要默认值,因为Mongoose足够聪明,可以根据需要创建阵列。

2.手动将修改的对象标记为已修改

如果出于某种原因您不希望或无法修改架构,则可以手动将analytic对象标记为已修改,以便Mongoose知道:

user.analytic.today.push(req.body.visitor) // push the data object to the array
user.markModified('analytic'); // mark field as modified
user.save(...);

这表示Mongoose analytic或它的任何子级已更改,并在调用.save时触发更新。 但是请注意,Mongoose将此视为对象的完整更改,而对于选项1,它可以使用$push代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM