Javascript MongooseJS:`TypeError:Object#<;对象>;没有方法';保存';`:无法保存文档的一部分?
我正在研究如何检索数组元素的堆栈溢出,通过查看以下链接,我发现了这一点: 仅检索MongoDB集合中对象数组中的查询元素 以下是我根据以下问题创建的查询:Javascript MongooseJS:`TypeError:Object#<;对象>;没有方法';保存';`:无法保存文档的一部分?,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我正在研究如何检索数组元素的堆栈溢出,通过查看以下链接,我发现了这一点: 仅检索MongoDB集合中对象数组中的查询元素 以下是我根据以下问题创建的查询: exports.confirmFriend = function(req, res){ if(req.body._id) {delete req.body._id} User.findOne({'username': req.params.username}, {'friends': {$elemMatch: {'username
exports.confirmFriend = function(req, res){
if(req.body._id) {delete req.body._id}
User.findOne({'username': req.params.username}, {'friends': {$elemMatch: {'username': req.body.username}}}, function (err, user){
if(err) { return handleError(res, err); }
if(!user) { return res.send(404); }
//This is because $elemMatch returns only the first element so only 1 element will be populated
user.friends[0] = req.body;
user.save();
//Here I want to UPDATE or SAVE the document that I queried for now
});
现在,我已经查询了user.friends元素,并为其正确分配了req.body和正确的内容,我想知道,是否有方法更新或保存我执行此分配/查询的文档?当我在作业结束时调用
user.save()
时,我得到一个错误,它说:TypeError:Object#没有方法“save”
。有没有办法解决这个问题?谢谢 是的,所以这不再是猫鼬文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组
这意味着即使这是一个mongoose文档,.save()
也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容
因此,您的方法可以归结为:
.save()
User.findOneAndUpdate(
{
"username": req.params.username,
"friends.username": req.body.username
},
{
"$set": { "friends.$": req.body }
},
function(err,user) {
// do something with the now modified user
}
);
第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组 这意味着即使这是一个mongoose文档,
.save()
也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容
因此,您的方法可以归结为:
.save()
User.findOneAndUpdate(
{
"username": req.params.username,
"friends.username": req.body.username
},
{
"$set": { "friends.$": req.body }
},
function(err,user) {
// do something with the now modified user
}
);
第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组 这意味着即使这是一个mongoose文档,
.save()
也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容
因此,您的方法可以归结为:
.save()
User.findOneAndUpdate(
{
"username": req.params.username,
"friends.username": req.body.username
},
{
"$set": { "friends.$": req.body }
},
function(err,user) {
// do something with the now modified user
}
);
第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组 这意味着即使这是一个mongoose文档,
.save()
也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容
因此,您的方法可以归结为:
.save()
User.findOneAndUpdate(
{
"username": req.params.username,
"friends.username": req.body.username
},
{
"$set": { "friends.$": req.body }
},
function(err,user) {
// do something with the now modified user
}
);