@Override public boolean markTouched(DocumentID<MongoType> id, String tag) { MongoQuery mq = new MongoQuery(); mq.requireID(id); DBObject update = new BasicDBObject(MongoDocument.METADATA_KEY+"."+DatabaseDocument.TOUCHED_METADATA_TAG+"."+tag, new Date()); DBObject dbo = getUpdateObject(update); if(documents.findAndModify(mq.toDBObject(), dbo)==null) { return false; } return true; }
@Override public boolean markPending(DatabaseDocument<MongoType> d, String stage) { MongoQuery mq = new MongoQuery(); mq.requireID(d.getID()); DBObject update = new BasicDBObject(); update.put(MongoDocument.METADATA_KEY+"."+MongoDocument.PENDING_METADATA_FLAG+"."+MongoDocument.DATE_METADATA_SUBKEY, new Date()); update.put(MongoDocument.METADATA_KEY+"."+MongoDocument.PENDING_METADATA_FLAG+"."+MongoDocument.STAGE_METADATA_SUBKEY, stage); DBObject dbo = getUpdateObject(update); if(documents.findAndModify(mq.toDBObject(), dbo)==null) { return false; } return true; }
@Override public MongoDocument getAndTag(DatabaseQuery<MongoType> query, String ... tag) { for(String t : tag) { ensureIndex(t); } MongoQuery mq = (MongoQuery)query; mq.requireMetadataFieldNotExists(Document.PENDING_METADATA_FLAG); /* The document must be fully committed (i.e. all attachments are committed) before we can fetch it * Using not equals to true here (instead of "equals false"), to allow for documents where committing * isn't set at all. */ mq.requireMetadataFieldNotEquals(Document.COMMITTING_METADATA_FLAG, true); for(String t : tag) { mq.requireMetadataFieldNotExists(DatabaseDocument.FETCHED_METADATA_TAG+"."+t); } DBObject update = new BasicDBObject(); for(String t : tag) { update.put(MongoDocument.METADATA_KEY+"."+DatabaseDocument.FETCHED_METADATA_TAG+"."+t, new Date()); } DBObject dbo = getUpdateObject(update); return findAndModify(mq.toDBObject(), dbo); }
DBObject updateObject = getUpdateObject(bob.get()); updateObject.putAll(getUnsetObject(getNullFields(md)));