在这里,我的钱是您所查找实际上并不匹配任何的“ADDRESS_ID”值。在回溯文档上执行.update()
通常不是您想要的,这会在代码中混淆问题。
转而执行.findOneAndUpdate()
最初都是由匹配的“电子邮件”和在这个完整的例子做了“addresses._id”值检索:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var addressSchema = new Schema({
name: String,
primary: { type: Boolean, default: false }
});
var userSchema = new Schema({
email: String,
addresses: [addressSchema]
});
var User = mongoose.model('User',userSchema);
mongoose.connect('mongodb://localhost/utest');
mongoose.set("debug",true);
async.series(
[
function(callback) {
User.remove({},callback);
},
function(callback) {
async.waterfall(
[
function(callback) {
User.create({
email: "[email protected]",
addresses: [
{ "name": "One" },{ "name": "Two" }
]
},callback)
},
function(user,callback) {
console.log(user);
User.findOneAndUpdate(
{
"email": user.email,
"addresses._id": user.addresses[1]._id
},
{
"$set": { "addresses.$.primary": true }
},
{ "new": true }
).then(function(newUser) {
console.log(newUser);
callback();
}).catch(function(err) {
callback(err);
});
}
],
callback
)
}
],
function(err) {
if (err) console.log(err.stack);
mongoose.disconnect();
}
);
这将始终如一地产生输出这样的:
{ __v: 0,
email: '[email protected]',
_id: 55ecf31a53558e183d208aa2,
addresses:
[ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
{ name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] }
{ _id: 55ecf31a53558e183d208aa2,
email: '[email protected]',
__v: 0,
addresses:
[ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
{ name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] }
而且具有调试输出中是这样的:
Mongoose: users.remove({}) {}
Mongoose: users.insert({ email: '[email protected]', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 })
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: '[email protected]' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false }
这只是设置示例,但主要的事情发生在.findOneAndUpdate()
,在承诺的解决方案中,您将返回的文档从指定数组元素的原始表单看到“更新”。
这就是你基本上应该在这里做的事情,并且对返回文档的任何进一步修改都是在“最初的”更新和获取“之后”完成的。
我在这里看不到任何回调。你是否试图直接从函数调用中返回? –
@BlakesSeven下面有~300行代码我不想在这里复制粘贴。我不想退还,我只想更新我找到的用户。我更新了我的问题。 – Steve
显示处理'.update()'然后查看数据的“最小示例”。无论如何,你可能真的想要['.findOneAnUpdate()'](http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate)。但是我的主要观点是,在这里'.update()'没有任何承诺或回调,所以至少在查看数据时它可能没有被“解雇”。你需要显示多一点*“之后有更多的代码”*。显示真正发生的事情(简而言之),但主要的行动。 –