这是我目前的文件:
{
"_id": "",
"title": "My Watchlist",
"series": [{
"seriesId": 1,
"following": true,
"seasons": []
}, {
"seriesId": 1,
"following": false,
"seasons": []
}]
}
正如您所看到的,目前有2个对象具有seriesId 1,但具有不同的后续布尔值。
如果查询与_id匹配,它应该将新对象推送到系列中,如果在"系列" -array中具有相同" seriesId"已存在它应该更改该对象中的字段,而不是添加新对象。
我目前有以下查询:
users.update(
{"_id": req.body.userId},
{
"$push": {
"series": {"seriesId": req.body.seriesId, "following": req.body.following}
}
}, (err, data) => {
if (err)
next(err);
});
如果我使用$ set它不会添加该对象,如果它还没有原始存在,据我所知你不能同时使用$ push和$ set? 这可以以任何方式解决,还是我必须重新考虑我的架构?
答案 0 :(得分:2)
您可以使用两个update
查询:
如果找到_id
并且seriesId
不在数组中,请将新项添加到数组中:
db.series.update({
"_id": req.body.userId,
"series": {
"$not": {
"$elemMatch": {
"seriesId": req.body.seriesId
}
}
}
}, {
$addToSet: {
series: {
"seriesId": req.body.seriesId,
"following": req.body.following,
"seasons": []
}
}
}, { multi: true });
如果找到_id
且在数组中找到seriesId
,请更新数组项:
db.series.update({
"_id": req.body.userId,
"series.seriesId": req.body.seriesId
}, {
$set: {
"series.$.following": req.body.following
}
}, { multi: true });