如果存在,则将对象推入数组,否则在MongoDB

时间:2016-12-26 13:35:44

标签: arrays mongodb mongodb-query

这是我目前的文件:

{
    "_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? 这可以以任何方式解决,还是我必须重新考虑我的架构?

1 个答案:

答案 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 });