推入数组字段时出现 Mongoose CastError

问题描述 投票:0回答:1

在我的应用程序中,我有一个用户模型,其中包含字段

requests
followers
,它们都存储
ObjectIds.

的数组
const userSchema = new mongoose.Schema({
    followers: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User",
        },
    ],
    requests: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User",
        },
    ]
})

我有一个查询,应该

push
followers
数组,当前文档的
requests
字段中的每个 id。完成此操作后,应将请求设置为空数组。这是尝试完成此操作的查询:

   User.updateOne(
        { _id: req.user._id },
        { $push: { followers: { $each: "$requests" } }, $set: { requests: [] } }
    )

但是,运行此代码时,出现以下错误:

CastError: Cast to ObjectId failed for value "$requests" (type string) at path "followers" because of "BSONError"

知道为什么会发生这个错误吗?我可以使用任何潜在的解决方案来正确执行此查询吗?谢谢。

node.js mongodb mongoose
1个回答
0
投票

在您的

updateOne
中,当您使用
$requests
时,MongoDB 会将其解释为字符串文字
"$requests"
- 而不是变量
$requests

如果您想使用这样的变量,您需要采用使用聚合管道更新方法,使用方括号

[]
来定义聚合阶段的管道。

满足您所需需求的一个简单示例是利用

$concatArrays
聚合运算符,如下所示:

await User.updateOne({
  _id: req.user._id
},
[
  {
    $set: {
      followers: {
        $concatArrays: [
          "$followers",
          "$requests"
        ]
      }
    }
  },
  {
    $set: {
      requests: []
    }
  }
])

请参阅 HERE 了解使用

db.collection.update()

的工作示例
© www.soinside.com 2019 - 2024. All rights reserved.