UpdateOne MongoDB 使用来自另一个字段的值进行推送
Posted
技术标签:
【中文标题】UpdateOne MongoDB 使用来自另一个字段的值进行推送【英文标题】:UpdateOne MongoDB with push using value from another field 【发布时间】:2021-12-21 03:29:00 【问题描述】:我正在尝试将文档的现有字段推送到我的数组。这是我的架构:
var mySchema = new Schema(
level:
type: Number,
default: 1
,
mHierarchy: [
userId:
type: mongoose.Types.ObjectId
,
index:
type: Number
]
)
我正在尝试使用 UpdateOne 并推送到 mHierarchy 并将外部级别设置为索引。
到目前为止我尝试过的:
MySchema.updateOne(
'_id': mySchemaId,
$push:
referredHierarchy:
userId: mongoose.Types.ObjectId(id),
index: '$$level'
)
我也试过这个:
let setQuery=
setQuery['mHierarchy.' + level + '.userId']= mongoose.Types.ObjectId(userId)
setQuery['mHierarchy.' + level + '.index']= '$$temp'
MySchema.updateOne(
'_id': mySchemaId,
$set: setQuery
,
let: temp: '$level'
)
以上都不起作用,我收到此错误:
"CastError: Cast to Number failed for value \"$$temp\" (type string) at path \"index\""
如何使用猫鼬实现这一目标?
注意:我使用 MongoDB 5 和“mongoose”:6.0.8
【问题讨论】:
要使用同一文档的另一个字段值更新一个字段,您可以使用带有聚合管道功能的更新(MongoDB v4.2 或更高版本)。 我想增加level
但为简单起见,我删除了它。如果我不使用$inc
操作,您的答案是正确的,$inc
未在管道中定义。谢谢。
使用 $add
聚合运算符来增加一个值。
@prasad_ 您可以测试您的解决方案或发布您的答案吗?我在不使用 $add
和 @inc
的情况下尝试了 PipeLine,但我无法以正确的方式将其推送到我的数组中。
@prasad_ 我终于明白了。如果您可以提交您的答案,我可以接受它供其他人使用。非常感谢
【参考方案1】:
您首先需要使用 $set 运算符将此字段添加到管道中。试试这个:
MySchema.updateOne( _id: mySchemaId ,
$set:
index: "$level",
,
$push:
referredHierarchy:
userId: mongoose.Types.ObjectId(id),
index: "$index",
,
);
出于测试原因尝试其他解决方法:
MySchema.updateMany( _id: mySchemaId ,[
$addFields:
index: "$level",
,
$push:
referredHierarchy:
index: "$index",
,
]);
updateOne 不接受管道聚合运算符,因此请尝试使用此 updateMany 进行测试。
【讨论】:
我收到此错误:MongooseError: Invalid update pipeline operator: "$push"
尝试我的最后一次编辑。
仍然无法正常工作,尽管我认为您的代码存在基于您的
和
的错误。您在 option
中使用了 $push
而不是 update
。
updateOne 可以接受管道聚合。关键是管道聚合不能接受$push
。谢谢你的回答,我试过了,但没有出现同样的错误以上是关于UpdateOne MongoDB 使用来自另一个字段的值进行推送的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB中updateOne超过findOneAndUpdate的用例[重复]
MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它
MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它