我正在使用Node和Mongoose,并尝试设置一个ISODate
元素数组:
"visitLog" : [
ISODate("2017-10-22T22:43:49.571Z"),
ISODate("2017-10-22T22:44:39.572Z"),
ISODate("2017-10-22T23:35:36.111Z"),
ISODate("2017-10-22T23:48:26.516Z"),
ISODate("2017-10-22T23:50:33.378Z"),
ISODate("2017-10-22T23:53:56.227Z"),
ISODate("2017-10-22T23:57:20.986Z")
]
所以我有一个现有的架构,其中visitLog
字段不存在,为模式添加了新字段 - visitLog: [ {type: Date, default: '' }],
并且它有效 - 结果就是您在上面看到的。
但是当我创建一个包含已更新模式的新文档时,"visitLog" : [ ]
,$push
刚刚停止工作。
如果需要,这是mongoose查询:
// conditions is a ternary operator that checks whether req.body username
// is an email or not, and puts needed condition to a query
var conditions = (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.username)) ? ' {email: req.body.username } ' : ' {username: req.body.username } ';
var fieldsToSet = {
$push: {
visitLog: new Date().toISOString(),
}
};
var options = { upsert: true };
User.findOneAndUpdate(conditions, fieldsToSet, options, function(err, user) { ...
工作文档是在mongo控制台中创建的,而第二个是在服务器上生成的,但我不知道这怎么会有所不同。
使用$push
shuld处理空数组。有人可以解释这里有什么问题吗?
谢谢。
修改
它认为使用findByIdAndUpdate
而不使用conditions
适用于两个文档:
var fieldsToSet = {
$push: {
visitLog: new Date().toISOString(),
}
};
var options = { new: true };
req.app.db.models.User
.findByIdAndUpdate(req.user.id, fieldsToSet, options, function(err, user) {
答案 0 :(得分:1)
您可以执行以下查询。
User.findOne(condiitons, (err, user) => {
if (user) {
var date = new Date().toISOString();
user.visitLog.push(date);
user.save();
...
}
});