Выдвиньте массив объектов в массив документов в MongoDB без дублирования значения свойства - PullRequest
0 голосов
/ 30 апреля 2019

Текущий статус документа MongoDB:

// Team document

{
    "_id" : ObjectId("5cc6d4c8c3faa84f28e5fe1d"),
    "teamMembers" : [ 
        {
            "player" : ObjectId("5ba24b8594a05f3788980a11"),
            "_id" : ObjectId("5cc6d4c8c3faa84f28e5fe1e")
        }
    ],
    "createdDateTime" : ISODate("2019-04-29T10:41:12.836Z"),
    "__v" : 0
}

У меня есть следующие данные запроса, которые необходимо добавить в свойство teamMembers вышеупомянутого документа:

{
    "teamId": "5cc6d4c8c3faa84f28e5fe1d",
    "playerList": [
        {
            "player": "5ba24b8594a05f3788980a11"
        },
        {
            "player": "5ba38151e1baf00264786891"
        },
        {
            "player": "5ba38151e1baf0026478688c"
        }
    ]
}

Я попробовал следующий код moongoose:

Team.update({ '_id': req.body.teamId }, {
        $addToSet: {
            'teamMembers': { $each: req.body.playerList }
        }
    }, function (err) {
        if (err) {
             /* error response */ 
        }
        else {
            /* success response */
        }
    });

Проблема: Если игрок уже существует в массиве, он не должен быть добавлен в массив toteamMembers, но в моем случае это добавление дублирующих записей игрока. Таким образом, в вышеприведенном случае player:5ba24b8594a05f3788980a11 уже существует в документе MongoDB, поэтому его не нужно добавлять, но оставшиеся два игрока должны быть добавлены в teamMembers массив

1 Ответ

0 голосов
/ 30 апреля 2019

Я не знаю точный запрос, но приведенный ниже запрос будет работать, если вы проверяете по одному члену за раз. Вам придется изменить это, чтобы проверить входные данные массива в запросе.

Team.findOneAndUpdate({ 
      '_id': req.body.teamId, 
      teamMembers: { $not: { $elemMatch: { player: player1 } } }, 
      $addToSet: { 'teamMembers': player1 } 
});

возможное решение

Team.findOneAndUpdate({ 
      '_id': req.body.teamId,
      teamMembers: { $not: { $elemMatch: { player: { $in : req.body. playerList } } } }, 
      $addToSet: { teamMembers': { $each: req.body.playerList }   
});

Что делает этот запрос? Он найдет и добавит нового игрока в документ с помощью _id после проверки, передан ли в команде teamMembers игрок в запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...