【问题标题】:$push into deeply nested array mongoose$push 进入深度嵌套的数组 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,但实际上什么也没做。

【问题讨论】:

    标签: node.js arrays mongodb mongoose push


    【解决方案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 得到了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2020-10-22
    • 2023-03-25
    • 2021-04-29
    • 2021-11-05
    • 2016-03-01
    相关资源
    最近更新 更多