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数组在哪里查找引用。