Как использовать java.util.Date как @Id в монго документах - PullRequest
0 голосов
/ 02 июля 2019

Хорошо, я оказался в простой, но раздражающей проблеме.Мои монго-документы используют java.util.Date в качестве идентификатора, и, как вы можете догадаться, идентификатор преобразуется (пружинные преобразователи) в ObjectId, я не могу обновить эти документы, потому что каждый раз, когда создается новый ObjectId (Date), получают полностьюдругой идентификатор, даже если дата одна и та же ...

как заставить монго просто использовать java.util.Date в качестве идентификатора?

с примером кода:

  public void updateNode(...node..) {
    final MongoTemplate mongoTemplate = ...
    final String collectionName = ...
    final Query query = (new Query()).addCriteria(Criteria.where("time").is(node.getTime()));
    final Update update = Update.update("time", node.getTime()).set("top", node.getTop())
          .set("bottom", node.getBottom()).set("mid", node.getMid())
          .set("startTime", node.getStartTime()).set("potential", node.isPotential());

    mongoTemplate.upsert(query, update, MyClassNode.class, collectionName);



  }

если я запускаю этот код в первый раз, когда объекты вставляются в базу данных, но с ObjectId ... если node.getTime () является java.sql.Date, тогда все в порядке.

если node.getTime () не является java.sql. Я не могу обновить документ, если он существует: почему?так как каждый раз, когда документ готовится, он создает новый ObjectId, обновление и запрос будут иметь два разных значения поля _id, и обновление завершится неудачей.

1 Ответ

0 голосов
/ 03 июля 2019

При проверке документации я обнаружил следующие данные:

В MongoDB для каждого документа, хранящегося в коллекции, требуется уникальное поле _id, которое действует как первичный ключ.Если во вставленном документе пропущено поле _id, драйвер MongoDB автоматически создает ObjectId для поля _id.

Это также относится к документам, вставленным с помощью операций обновления с upsert: true.

Ниже приведены общие параметры для хранения значений для _id:

  • Использовать ObjectId.
  • Использовать естественный уникальный идентификатор, если он доступен.Это экономит место и позволяет избежать дополнительного индекса.
  • Создайте автоматически увеличивающееся число.

Из документации я понял, что во избежание вставки одного и того же документа более одного раза, толькоиспользуйте upsert: true, если поле запроса уникально проиндексировано. Так что, если этот флаг установлен, вы найдете ваш идентификатор, преобразованный с помощью ObjectId (), чтобы сделать его уникальным.

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