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查询计算

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它

mongodb:如果元素不存在,则updateOne设置字符串数组,如果存在则保持不变

《MongoDB入门教程》第14篇 CRUD之更新文档