Node.js $push深入嵌套数组mongoose

Node.js $push深入嵌套数组mongoose,node.js,arrays,mongodb,mongoose,push,Node.js,Arrays,Mongodb,Mongoose,Push,我的用户模式如下所示 const userSchema = new mongoose.Schema({ firstName: { type: String }, lastName: { type: String }, movies: [ { name: String, duration: Number, actors: [{ name: String, age: Number }]

我的用户模式如下所示

const userSchema = new mongoose.Schema({
    firstName: { type: String },
    lastName: { type: String },
    movies: [
        {
            name: String,
            duration: Number,
            actors: [{ name: String, age: Number }]
        }
    ],
});
在使用express的NodeJS应用程序中,我试图更新我的actors数组,以使另一个actor的值从req.body开始

我以为我可以做这样的事

await User.updateOne(
     {
          _id: req.user.id
          movies._id: req.params.id
     },
     {
          $push: { 'movies.actors': req.body }
     }
)
我原以为这会将演员推入指定的电影
req.params.id
,但实际上什么也不做。

试试这个:

wait user.updateOne(
{$and:[{{u id:req.user.id},{movie.name:'我是传奇'}]},
{$set:{movies.actors:req.body},
);
尝试以这种方式使用:

db.collection.update({
“_id”:1,
“电影”_id:1
},
{
“$push”:{
“电影.$.actors”:要求正文
}
})
请注意,唯一的区别是使用
$
。但使用位置运算符时,您要说的是mongo,即推送新数据的位置

正如docs所说:

positional$运算符标识数组中要更新的元素,而不显式指定元素在数组中的位置

因此,您可以更新元素
movies.actors
在不知道元素位置的情况下推送新数据


示例

如果我的电影数组中没有演员(我第一次创建用户时没有),则会出现一个错误,提示无法创建字段Actor。我只有一个空的电影数组,似乎无法更新此数组field@J.F得到了答案。所以我注意到我可以使用
updateOne
更改某些内容后,我才真正让它工作起来。整个上午,我都在尝试使用
findbyiandupdate
做同样的事情,但没有成功。位置运算符的工作方式是否与使用
findbyiandupdate
的工作方式不同,并猜测当我将其更改为
updateOne
时,我错过了
$
。位置运算符需要知道数组引用。检查我已删除
“电影”的示例。\u id:1
。现在mongo不知道电影$在哪里。因此,我不能断言100%,但我认为您不能使用
findbyiandupdate
,因为您必须告诉mongo数组在哪里查找引用。