【发布时间】:2016-06-23 17:19:36
【问题描述】:
如何使用 $set 和 $push 更新 mongo?
我有以下数据:
[ { _id: 57682f69feaf405c51fdf144,
email: 'testuser1@testdomain.com',
username: 'testuser' },
{ username: 'sevilayha', _id: 5768d36c4c243de7422f681e, __v: 0 } ]
在我的快递 app.js 中:
// With Mongoose, everything is derived from a Schema. Let's get a reference to it and define our users.
var userSchema = mongoose.Schema({
name: String,
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
admin: Boolean,
location: String,
meta: {
age: Number,
website: String
},
created_at: Date,
updated_at: Date
});
// The next step is compiling our schema into a Model.
var User = mongoose.model('User', userSchema);
app.get("/", function(req, res) {
var updateQuery = {};
User.findOne({ username: /^sevilayha/ }, function (err, user) {
if (err) return console.error(err);
updateQuery["meta"] = {
date: Date.now()
}
user.update({
$push: updateQuery,
$set: { size: 'large' },
email: 'test@example.com'
});
res.status(200).json(user);
});
User.find(function (err, users) {
if (err) return console.error(err);
console.log(users);
});
我仍然得到相同的数据。没有更新、设置或推送。有什么我错过的想法吗?
我在“猫鼬”上:“~4.5.1”
【问题讨论】:
-
我相信您应该在更新数据后添加 user.save() 以便新值反映在数据库中。
-
不。没必要。也用 save() 测试过,但没有运气。
-
您是否尝试过不使用
.update,而是使用.save,而不是像这样:Model.findOne({ name: 'borne' }, function (err, doc){ doc.name = 'jason borne'; doc.visits.$inc(); doc.save(); });,取自猫鼬文档? -
是的,我的错!我在看 2.* 文档。我仍然觉得你没有将回调函数传递给更新调用很奇怪,因为在处理查询时可能会出现一些错误。您可以尝试添加回调并在触发后返回结果,因为一旦对 db 完成操作,模型可能会更新
-
$push是 meant for arrays,但meta不是数组。此外,size和email都不属于您的架构。
标签: node.js mongodb express mongoose