MongoDB / Mongoose - добавление объекта в массив объектов, только если определенное поле уникально - PullRequest
0 голосов
/ 09 декабря 2018

Итак, у меня есть вложенный массив объектов в моем документе MongoDB, и я хотел бы добавить новый объект в массив, только если определенное поле (в данном случае, eventId) уникально.Мой вопрос очень похож на этот пост , только я не могу заставить это решение работать в моем случае.

Вот как выглядят документы (UserModel):

{
  "portal" : {
    "events" : [ 
      {
        "important" : false,
        "completed" : false,
        "_id" : ObjectId("5c0c2a93bb49c91ef8de0b21"),
        "eventId" : "5bec4a7361853025400ee9e9",
        "user_notes" : "My event note"
      },
      ...and so on
    ]
  }
}

А вот моя (пока безуспешная) операция с Mongoose:

UserModel.findByIdAndUpdate(
  userId,
  { "portal.events.eventId": { $ne: req.body.eventId } },
  { $addToSet: { "portal.events": req.body } },
  { new: true }
);

В основном я пытаюсь использовать '$ne', чтобы проверить, является ли поле уникальным, а затем '$addToSet'(или '$push', я считаю, что они функционально эквивалентны в этом случае) для добавления нового объекта.

Может ли кто-нибудь указать мне правильное направление?

Приветствия, Гейб

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Если вы посмотрите на документацию вашего метода, вы увидите, что переданные параметры не в правильном порядке.

findByIdAndUpdate(id, update, options, callback)

Я бы использовал update вместо этого и имел бываша id и portal.events.eventId": { $ne: req.body.eventId } часть исходного фильтра, за которой следует $addToSet: { "portal.events": req.body }

Что-то из этих строк:

UserModel.update(
  { 
     "_id": mongoose.Types.ObjectId(userId), 
     "portal.events.eventId": { $ne: req.body.eventId }
  },
  { $addToSet: { "portal.events": req.body } },
  { new: true }
);
0 голосов
/ 09 декабря 2018

Вам необходимо включить ваш eventId чек в условную часть вашего запроса.Поскольку вы используете findByIdAndUpdate , вы можете передать в качестве условия только одно значение, сопоставленное с _id.Поэтому вы должны использовать findOneAndUpdate , чтобы указать пользовательское условие фильтрации, попробуйте:

UserModel.findOneAndUpdate(
    { _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
    { $addToSet: { "portal.events": req.body } },
    { new: true }
);
...