【问题标题】:Creating/Updating Sequences - MongoDB创建/更新序列 - MongoDB
【发布时间】:2012-06-17 01:10:19
【问题描述】:

我创建了一个“序列”集合。它有“名称”和“计数器”字段。 “name”字段设置为“Tag”,“counter”字段设置为 0。以下是返回“counter”字段下一个值的方法中的代码。

final Sequence tagSequence = mongoTemplate.findAndModify(
  new Query(Criteria.where("name").is("Tag")), 
  new Update().inc("counter", 1), 
  new FindAndModifyOptions().returnNew(true), Sequence.class);

但是,这段代码不起作用。有输入吗?

我在这里找到了一个实现,http://dev.bubblemix.net/blog/2011/04/auto-increment-for-mongodb-with-the-java-driver/,但是,我想知道这段代码有什么问题。

【问题讨论】:

  • 您能否提高 mongod 服务器上的日志级别(例如 mongod -vvv)并检查执行此代码时实际发送到服务器的内容?
  • 我执行了您链接到的纯 Java 驱动程序代码,并在运行 mongod -v 的日志中看到了这一点: Wed Jun 20 19:41:33 [conn3] run command test.$cmd { findandmodify: “seq”,查询:{_id:“seq1”},更新:{$inc:{seq:1}},新:true,upsert:true}星期三6月20日19:41:33 [conn3]查询test.seq查询:{_id:“seq1”}ntoreturn:1 idhack:1 reslen:48 0ms Wed Jun 20 19:41:33 [conn3]更新test.seq查询:{_id:“seq1”}更新:{$inc:{ seq: 1 } } idhack:1 0ms
  • 从这些日志中我不太明白到底发生了什么。
  • 您链接的代码正常工作,日志显示服务器上发生的情况。您应该将此与运行代码时在日志中看到的内容进行比较,以确定有什么区别。

标签: java mongodb spring-data database


【解决方案1】:

如果您首先在 MongoDB 中保存了带有“Tag”名称的 Sequence 对象,则您的代码可以正常工作。我建议您使用 @Id 注释来注释 name 字段。例如:

public class Sequence {
    @Id
    protected final String name;
    protected Long counter;

    public Sequence(String name, Long counter) {
        this.name = name;
        this.counter = counter;
    }
    public String getName() {
        return name;
    }
    public Long getCounter() {
        return counter;
    }
    public void setCounter(Long counter) {
        this.counter = counter;
    }

}

在 MongoDB 中保存对象:

template.save(new Sequence("Tag",0L))

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多