$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的主要内容,如果未能解决你的问题,请参考以下文章

嵌套数组中的Mongodb $push

$push 到多个嵌套数组两个深

$push 到多个嵌套数组两个深

蓝鸟嵌套承诺与每个/传播

对象数组 深度复制,支持对象嵌套数组数组嵌套对象

Ramda js:具有嵌套对象数组的深度嵌套对象的镜头