【问题标题】:How to insert data in mongoDB如何在mongoDB中插入数据
【发布时间】:2020-05-22 18:24:18
【问题描述】:

我想读写一个 mongodb 数据库。要创建一个条目,我使用以下代码:

private void updateMongoDb(TagEnum tag, BigDecimal minLen, BigDecimal maxLen,
                      List<BigDecimal> defaultLengths,
                      List<Double> lengthMultipliers, boolean useLengthMultipliers) {
    TagPreferences tagPreferences  = new TagDepositPreferences();
    tagPreferences.setProvider(tag);
    tagPreferences.setMinLen(minLen);
    tagPreferences.setMaxLen(maxLen);
    tagPreferences.setDefaultLengths(defaultLengths);
    tagPreferences.setLengthMultipliers(lengthMultipliers);
    tagPreferences.setUseLengthMultipliers(useLengthMultipliers);

    Query query = new Query();
    query.addCriteria(Criteria.where("tag").is(tag));
    query.addCriteria(Criteria.where("minLen").is(minLen));
    query.addCriteria(Criteria.where("maxLen").is(maxLen));
    query.addCriteria(Criteria.where("defaultLengths").is(defaultLengths));
    query.addCriteria(Criteria.where("lengthMultipliers").is(lengthMultipliers));
    query.addCriteria(Criteria.where("useLengthMultipliers").is(useLengthMultipliers));

    Update update = new Update();
    update.setOnInsert(tagPreferences.CREATED_AT, Instant.now());
    update.set(tagPreferences.LAST_MODIFIED_AT, Instant.now());
    update.set("tag", tagPreferences.getTag());
    update.set("minLen", tagPreferences.getMinLen());
    update.set("maxLen", tagPreferences.getMaxLen());
    update.set("defaultLengths", tagPreferences.getDefaultLengths());
    update.set("useLengthMultipliers", tagPreferences.isUseLengthMultipliers());
    update.set("lengthMultipliers", tagPreferences.getLengthMultipliers());

    mongoTemplate.upsert(query, update, TagPreferences.class);
}

要从中读取,我有一个带有方法的存储库类

TagPreferences findAllByTag(TagEnum tag);

我愿意:

 TagPreferences tagPreferences = tagPreferencesRepository.findAllByTag(TagEnum tag);

问题是当我只执行一次updateMongoDb 时,当我执行findAllByTag() 方法时,我总是得到三个具有相同值的结果,而不是一个。如果您能解释其背后的根本原因并提出更正建议,那将非常有帮助。

【问题讨论】:

  • findAllByTag 是做什么的?
  • 它的定义是:List findAllByTag(TagEnum tag);它返回一个 TagPreferences 对象列表,这些对象与调用方法时传递的参数的要求相匹配。问题是,当我只插入 TagEnum x 的一个 TagPreferences 对象,然后调用 findAllByTag(x) 时,我得到的不是包含一个对象的列表,而是 3。
  • 数据库中是否有多个带有x的文档,或者findAllByTag复制了响应?
  • 谢谢。我在开发程序时添加了多个条目。我创建了一个删除它们的方法( void deleteAllByTag(TagEnum tagEnum); 然后只添加了我想要的条目,现在我得到了正确的结果。

标签: java spring mongodb spring-boot java-8


【解决方案1】:

@Joe 在评论部分给出了解决方案。问题是在重复运行该程序后,mongo 数据库中已经充满了不相关的条目。这可以通过创建一个

void deleteAllByTag(TagEnum tagEnum);

TagPreferencesRepository 上的方法并从顶部的 updateMongoDb() 方法内部调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2021-02-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多