$推入深层嵌套的数组猫鼬
$push into deeply nested array mongoose
我的userSchema如下...
const userSchema = new mongoose.Schema({
firstName: { type: String },
lastName: { type: String },
movies: [
{
name: String,
duration: Number,
actors: [{ name: String, age: Number }]
}
],
});
在我的带有 express 的 NodeJS 应用程序中,我正在尝试更新我的 actors 数组以让另一个具有来自 req.body.
的值的 actor
我以为我可以做这样的事情...
await User.updateOne(
{
_id: req.user.id
movies._id: req.params.id
},
{
$push: { 'movies.actors': req.body }
}
)
我认为这会将演员推入指定的电影req.params.id
,但实际上什么也没做。
试试这个:
await user.updateOne(
{$and:[{_id: req.user.id},{movie.name: 'I am Legend'}]},
{$set: { movies.actors:req.body}},
);
尝试以这种方式使用 positional operator $
:
db.collection.update({
"_id": 1,
"movies._id": 1
},
{
"$push": {
"movies.$.actors": req.body
}
})
请注意,唯一的区别是 $
的使用。但是对于位置运算符,你说的是 mongo 将新数据推送到哪里。
正如文档所说:
The positional $ operator identifies an element in an array to update without explicitly specifying the position of the element in the array.
因此您可以更新元素 movies.actors
在不知道元素位置的情况下推送新数据。
示例here
我的userSchema如下...
const userSchema = new mongoose.Schema({
firstName: { type: String },
lastName: { type: String },
movies: [
{
name: String,
duration: Number,
actors: [{ name: String, age: Number }]
}
],
});
在我的带有 express 的 NodeJS 应用程序中,我正在尝试更新我的 actors 数组以让另一个具有来自 req.body.
的值的 actor我以为我可以做这样的事情...
await User.updateOne(
{
_id: req.user.id
movies._id: req.params.id
},
{
$push: { 'movies.actors': req.body }
}
)
我认为这会将演员推入指定的电影req.params.id
,但实际上什么也没做。
试试这个:
await user.updateOne(
{$and:[{_id: req.user.id},{movie.name: 'I am Legend'}]},
{$set: { movies.actors:req.body}},
);
尝试以这种方式使用 positional operator $
:
db.collection.update({
"_id": 1,
"movies._id": 1
},
{
"$push": {
"movies.$.actors": req.body
}
})
请注意,唯一的区别是 $
的使用。但是对于位置运算符,你说的是 mongo 将新数据推送到哪里。
正如文档所说:
The positional $ operator identifies an element in an array to update without explicitly specifying the position of the element in the array.
因此您可以更新元素 movies.actors
在不知道元素位置的情况下推送新数据。
示例here