【问题标题】:documents not removed using mongo-jackson未使用 mongo-jackson 删除的文档
【发布时间】:2012-04-02 16:28:17
【问题描述】:

我正在寻找我们应用程序中的一个严重错误,经过一番挖掘后,我将其分解为这个示例。使用杰克逊集合,我无法删除文档。通常它适用于我刚刚插入的单个文档。在下面的示例中,我只是尝试清除单元测试集合。

import java.net.UnknownHostException;

import net.vz.mongodb.jackson.DBCursor;
import net.vz.mongodb.jackson.JacksonDBCollection;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.test.model.Account;

public class MongoTest {

  public static void main(String[] args) {
    try {
        Mongo mongo = new Mongo("localhost", 27017);
        DB db = mongo.getDB("orion-unittest");

        // get a single collection
        DBCollection collection = db.getCollection("account");
        JacksonDBCollection<Account, String> jacksonCollection = JacksonDBCollection.wrap(collection, Account.class, String.class);

        // doesn't work
        DBCursor<Account> jacksonCursor = jacksonCollection.find();
        while (jacksonCursor.hasNext()) {
            jacksonCollection.remove(jacksonCursor.next());
        }
        System.out.println(jacksonCollection.getCount());

        // works!
        com.mongodb.DBCursor cursor = collection.find();
        while (cursor.hasNext()) {
            collection.remove(cursor.next());
        }
        System.out.println(collection.getCount());

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (MongoException e) {
        e.printStackTrace();
    }
  }

}

控制台输出:
6
0

奇怪的是,当我监控 mongo 服务器活动时,我看到删除命令正在传递。我错过了什么,还是杰克逊映射器的错误?

这里是 Account 类 - 没什么。 id 用 _id 键填充:

import net.vz.mongodb.jackson.Id;

public class Account {
    @Id
    String id;
    String nickname = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

【问题讨论】:

    标签: java mongodb jackson mongo-java


    【解决方案1】:

    我没有使用过 mongo-jackson-mapper,但正如我在 source code 中看到的那样,它只调用 dbCollection.remove 方法本身。所以我猜你的问题是WriteConcern。试试这个:

    jacksonCollection.remove(jacksonCursor.next(), WriteConcern.FSYNC_SAFE);
    

    并且测试2分别删除(不是一个接一个),所以你可以真正了解它是否删除(它也可以有删除滞后)。

    【讨论】:

      【解决方案2】:

      我通过使用@ObjectId 而不是@Id 找到了解决方案。问题是,在我的 id 被序列化为

      {"_id": ObjectId("4f7551a74206b4f8e692bda3")} 
      

      而不是类似:

      {"_id": "4f7551a74206b4f8e692bda3"} 
      

      ...它通过删除尝试查找匹配对象而使查询失败。 @ObjectId 注解现在等于序列化的结果。

      【讨论】:

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