我在我们的应用程序中追逐一个严重的错误,经过一些挖掘后我将其分解为这个例子。使用jackson集合,我无法删除文档。通常它适用于我刚插入的单个文档。在下面的示例中,我只是尝试清除unittest-collection。
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服务器活动时,我看到传递的删除命令。我错过了什么,或者这是杰克逊映射器的错误?
这里的帐户类 - 没什么了。 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;
}
}
答案 0 :(得分:0)
我没有使用过mongo-jackson-mapper,但正如我在source code中看到的那样,它只调用dbCollection.remove
方法本身。所以我想你的问题是WriteConcern。试试这个:
jacksonCollection.remove(jacksonCursor.next(), WriteConcern.FSYNC_SAFE);
和测试2分别删除(不是一个接一个),所以你可以真正理解它是否删除(它也可以删除滞后)。
答案 1 :(得分:0)
我使用@ObjectId而不是@Id找到了解决方案。问题是,在我的id被序列化为
之前{"_id": ObjectId("4f7551a74206b4f8e692bda3")}
而不是像:
{"_id": "4f7551a74206b4f8e692bda3"}
...通过删除尝试查找匹配对象来完成查询失败。 @ObjectId注释现在等于序列化的结果。