$push 进入深度嵌套的数组 mongoose
Posted
技术标签:
【中文标题】$push 进入深度嵌套的数组 mongoose【英文标题】:$push into deeply nested array mongoose 【发布时间】:2021-04-17 21:50:34 【问题描述】:我的userSchema如下...
const userSchema = new mongoose.Schema(
firstName: type: String ,
lastName: type: String ,
movies: [
name: String,
duration: Number,
actors: [ name: String, age: Number ]
],
);
在我的带有 express 的 NodeJS 应用程序中,我正在尝试更新我的演员数组以拥有另一个演员,该演员的价值来自 req.body。
我以为我可以做这样的事情......
await User.updateOne(
_id: req.user.id
movies._id: req.params.id
,
$push: 'movies.actors': req.body
)
我认为这会将演员推入指定的电影req.params.id
,但实际上什么也没做。
【问题讨论】:
【参考方案1】:尝试以这种方式使用positional operator $
:
db.collection.update(
"_id": 1,
"movies._id": 1
,
"$push":
"movies.$.actors": req.body
)
请注意,唯一的区别是使用$
。但是对于位置运算符,您是在说 mongo 在哪里推送新数据。
正如文档所说:
位置 $ 运算符标识数组中要更新的元素,而无需明确指定该元素在数组中的位置。
所以你可以在不知道元素位置的情况下更新元素movies.actors
推送新数据。
例如here
【讨论】:
所以当我注意到我可以使用updateOne
更改某些内容后,我才真正开始使用它。我整个早上都在尝试使用findByIdAndUpdate
做同样的事情,但没有成功。位置运算符是否与使用 findByIdAndUpdate
的方式不同,并猜测我在将其更改为 updateOne
时错过了 $
。
位置运算符需要知道数组引用。检查this 示例,其中我已删除"movies._id": 1
。现在 mongo 不知道 movies.$
在哪里。所以我不能断言 100% 但我认为你不能使用 findByIdAndUpdate
因为你必须告诉 mongo 数组在哪里查看参考。【参考方案2】:
试试这个:
await user.updateOne(
$and:[_id: req.user.id,movie.name: 'I am Legend'],
$set: movies.actors:req.body,
);
【讨论】:
我收到一条错误消息,提示无法创建现场演员 如果我的电影数组中没有演员,而我第一次创建用户时没有。我只有一个空电影数组,但似乎无法更新此字段 @J.F 得到了答案。以上是关于$push 进入深度嵌套的数组 mongoose的主要内容,如果未能解决你的问题,请参考以下文章