MongoDB pu sh во вложенный массив - PullRequest
2 голосов
/ 14 января 2020

У меня есть эта схема

{
    "_id": {
        "$oid": "5e187b1791c51b4b105fcff0"
    },
    "username": "test",
    "email": "test@test.com",
    "role": "admin",
    "userScoreFantasy": {
        "tournaments": [
            {
                "tournament_id": {
                    "$oid": "5e1892fb480f344830a3f160"
                },
                "predictions": [],
                "score": null
            },
            {
                "tournament_id": {
                    "$oid": "5e189f5f8d88292754e10b37"
                },
                "predictions": [],
                "score": null
            }
        ],
        "totalScore": null
    },
}

Я хочу сделать это:

  1. Найти пользователя с предопределенным идентификатором пользователя
  2. Передать весь массив userScoreFantasy.tournaments чтобы найти указанный c идентификатор турнира
  3. Pu sh в массиве найденных турнирных прогнозов, подобный этому объекту:
{
    score,
    "match_id": foundMatch._id
}

Таким образом, массив турниров станет:

[
    {
        "tournament_id": {
            "$oid": "5e1892fb480f344830a3f160"
        },
        "predictions": [
            "score" : 200,
            "match_id": "5e1892fb480f34faw21410"
        ],
        "score": null
    },
]

Я пытался сделать это:

 Users.update({
                      "_id": prediction.user_id,
                      "userScoreFantasy.tournaments": {
                        "$elemMatch": {
                          "tournament_id": foundMatch.tournament_id
                        }
                      }
                    }, {
                      "$push": {
                        "userScoreFantasy.tournaments.$.predictions": {
                          score,
                          "match_id": foundMatch._id
                        }
                      }
                    })

Но массив не обновляется.

РЕДАКТИРОВАТЬ: Рабочий вызов:

Users.updateOne({
                      "_id": ObjectID(prediction.user_id),
                    }, {
                      $addToSet: {
                        "userScoreFantasy.tournaments.$[element].predictions": {
                          score,
                          "match_id": foundMatch._id
                        }
                      }
                    }, {
                      arrayFilters: [{
                        "element.tournament_id": ObjectID(foundMatch.tournament_id)
                      }]
                    }

                  )

1 Ответ

2 голосов
/ 14 января 2020

Вы должны использовать идентификатор позиции для обновления ваших массивов, например так:

Users.updateOne(
    {
        "_id": prediction.user_id,
    },
    {
        $addToSet: {
            "userScoreFantasy.tournaments.$[element].predictions": {
                score,
                "match_id": foundMatch._id
            }
        }
    },
    {arrayFilters: [{"element.tournament_id": foundMatch.tournament_id}]}
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...