在我的应用程序中,我有一个用户模型,其中包含字段
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"
知道为什么会发生这个错误吗?我可以使用任何潜在的解决方案来正确执行此查询吗?谢谢。
在您的
updateOne
中,当您使用 $requests
时,MongoDB 会将其解释为字符串文字 "$requests"
- 而不是变量 $requests
。
如果您想使用这样的变量,您需要采用使用聚合管道更新方法,使用方括号
[]
来定义聚合阶段的管道。
满足您所需需求的一个简单示例是利用
$concatArrays
聚合运算符,如下所示:
await User.updateOne({
_id: req.user._id
},
[
{
$set: {
followers: {
$concatArrays: [
"$followers",
"$requests"
]
}
}
},
{
$set: {
requests: []
}
}
])
请参阅 HERE 了解使用
db.collection.update()
的工作示例