【发布时间】:2020-04-22 19:29:16
【问题描述】:
我知道这个问题在这里已经被打死了,但是我已经尝试了所有方法并且无法解决这个问题。快把我逼疯了。
我有一个看起来像这样的模型:
customer {
email: String,
password: String,
addresses: [addresses_schema]
}
address_schema 看起来像
address {
addr1: String,
... Other address fields
primary_address: Boolean
}
现在,我想更新用户的特定地址记录,使其 primary_address 为 true。
所以我这样做:
var modifyUser = function(address_id){
User.findOne( { email: email } ).then(function(user){
user.update({ 'addresses._id': address_id },
{ $set: { 'addresses.$.primary_address': 'true' } } )
.then(function(){
console.log('Should eventually reach here');
}).catch (err) {
console.log('err:', err.message);
});
user.save();
});
}
但是,如果我在更新前后获取 user.addresses,则根本没有任何变化。相反,它给了我错误:
cannot use the part (addresses of addresses._id) to traverse the element ({addresses[ {addr1: '123 test street', addr2: '', city: 'test city' ... ]}
有人可以帮助我吗?我真的很感激。谢谢!
【问题讨论】:
-
我在这里看不到任何回调。你想直接从函数调用中返回这个吗?
-
@BlakesSeven 下面有大约 300 行代码,我不想在这里复制粘贴。我不想退回它,我只想更新我找到的用户。我已经更新了我的问题。
-
显示处理
.update()然后查看数据的“最小示例”。无论如何,您可能真的想要.findOneAnUpdate()。但我的主要观点是这里的.update()没有承诺或回调,所以至少在你查看数据时它可能还没有“触发”。您需要显示的不仅仅是“在此之后的更多代码”。展示真正发生的事情(简而言之),但主要行动。 -
@BlakesSeven,实际上,更新是代码的核心。将 then 调用附加到更新会提供更多信息。在我深入研究之后,我会在几分钟内再次更新。
-
“最小大小写”。应该花你 2 分钟的时间来写。创建文档,找到它,更新它,读回来。但是您在此处的代码甚至根本没有显示更新正在执行。这就是我要求你补充的。
user.update()什么都不做。它需要被执行。它也应该是User.update(),并且可能整个事情应该是.findOneAnUpdate(),如前所述。如果你有 300 行代码操作然后调用.save()那么那是坏。
标签: node.js mongodb mongoose mongodb-query