@PrePersist void prePersist() { if (myLongId == null) { final String collName = ds.getCollection(getClass()).getName(); final Query<StoredId> q = ds.find(StoredId.class).filter("_id", collName); final UpdateOperations<StoredId> uOps = ds.createUpdateOperations(StoredId.class).inc("value"); StoredId newId = ds.findAndModify(q, uOps); if (newId == null) { newId = new StoredId(collName); ds.save(newId); } myLongId = newId.getValue(); } } }
@Test public void testVersionsWithFindAndModify() { final ALongPrimitive initial = new ALongPrimitive(); Datastore ds = getDs(); ds.save(initial); Query<ALongPrimitive> query = ds.find(ALongPrimitive.class) .field("id").equal(initial.getId()); UpdateOperations<ALongPrimitive> update = ds.createUpdateOperations(ALongPrimitive.class) .set("text", "some new value"); ALongPrimitive postUpdate = ds.findAndModify(query, update); Assert.assertEquals(initial.version + 1, postUpdate.version); }
@Test public void findAndModify() { getMorphia().map(DocumentValidation.class); getDs().enableDocumentValidation(); getDs().save(new DocumentValidation("Harold", 100, new Date())); Query<DocumentValidation> query = getDs().find(DocumentValidation.class); UpdateOperations<DocumentValidation> updates = getDs().createUpdateOperations(DocumentValidation.class) .set("number", 5); FindAndModifyOptions options = new FindAndModifyOptions() .bypassDocumentValidation(false); try { getDs().findAndModify(query, updates, options); fail("Document validation should have complained"); } catch (MongoCommandException e) { // expected } options.bypassDocumentValidation(true); getDs().findAndModify(query, updates, options); Assert.assertNotNull(query.field("number").equal(5) .find(new FindOptions().limit(1)) .next()); }
UpdateOperations<FacebookUser> updateOperations = getDs().createUpdateOperations(FacebookUser.class) .inc("loginCount"); FacebookUser results = getDs().findAndModify(query, updateOperations); assertEquals(0, getDs().find(FacebookUser.class).filter("id", 1).get().loginCount); assertEquals(1, getDs().find(FacebookUser.class).filter("id", 2).get().loginCount); assertEquals(1, results.loginCount); results = getDs().findAndModify(query, updateOperations, true); assertEquals(0, getDs().find(FacebookUser.class).filter("id", 1).get().loginCount); assertEquals(2, getDs().find(FacebookUser.class).filter("id", 2).get().loginCount); assertEquals(1, results.loginCount); results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(3L) .field("username").equal("Jon Snow"), updateOperations, true, true); results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(4L) .field("username").equal("Ron Swanson"), updateOperations, false, true);
UpdateOperations<FacebookUser> updateOperations = getDs().createUpdateOperations(FacebookUser.class) .inc("loginCount"); FacebookUser results = getDs().findAndModify(query, updateOperations); assertEquals(0, getDs().find(FacebookUser.class).filter("id", 1) .find(new FindOptions().limit(1)) assertEquals(1, results.loginCount); results = getDs().findAndModify(query, updateOperations, new FindAndModifyOptions() .returnNew(false)); assertEquals(0, getDs().find(FacebookUser.class).filter("id", 1) assertEquals(1, results.loginCount); results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(3L) .field("username").equal("Jon Snow"), updateOperations, new FindAndModifyOptions() results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(4L) .field("username").equal("Ron Swanson"), updateOperations, new FindAndModifyOptions()
UpdateOperations<FacebookUser> updateOperations = getDs().createUpdateOperations(FacebookUser.class) .inc("loginCount"); FacebookUser results = getDs().findAndModify(query, updateOperations, new FindAndModifyOptions()); assertEquals(0, getDs().find(FacebookUser.class).filter("id", 1) .find(new FindOptions().limit(1)) assertEquals(1, results.loginCount); results = getDs().findAndModify(query, updateOperations, new FindAndModifyOptions() .returnNew(false) .collation(Collation.builder() .loginCount); results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(3L) .field("username").equal("Jon Snow"), results = getDs().findAndModify(getDs().find(FacebookUser.class) .field("id").equal(4L) .field("username").equal("Ron Swanson"),