документы, не удаленные с помощью Монго-Джексона - PullRequest
0 голосов
/ 02 апреля 2012

Я гоняюсь за серьезной ошибкой в ​​нашем приложении, и после некоторого копания я разбил ее до этого примера.Используя коллекцию Джексона, я не могу удалить документы.Обычно это работает для одного документа, который я только что вставил.В следующем примере я просто пытаюсь очистить коллекцию unittest.

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();
    }
  }

}

Консольный вывод:60

Странно то, что когда я наблюдаю за действиями сервера Монго, я вижу, что передаются команды удаления.я что-то пропустил, или это ошибка Джексона Маппера?

здесь класс Account - ничего особенного нет.идентификатор заполнен ключом _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;
    }
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Я нашел решение, используя @ObjectId вместо @Id.проблема заключалась в том, что до того, как мой идентификатор был сериализован в

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

, а не в что-то вроде:

{"_id": "4f7551a74206b4f8e692bda3"} 

..., который не прошел запрос, выполненный удалением, пытаясь найти соответствующийобъект.аннотация @ObjectId теперь равна результатам сериализации.

0 голосов
/ 03 апреля 2012

Я не использовал mongo-jackson-mapper, но, как я увидел в исходном коде , он вызывает только сам метод dbCollection.remove. Итак, я думаю, что ваша проблема с WriteConcern . попробуйте это:

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

и тест 2 удаляются отдельно (не один за другим), так что вы действительно можете понять, удаляет ли его или нет (может также быть задержка удаления).

...