if (!query.containsField("remove") && !query.containsField("update")) {
throw new MongoServerException("need remove or update");
}
BSONObject queryObject = new BasicBSONObject();
if (query.containsField("query")) {
queryObject.put("query", query.get("query"));
} else {
queryObject.put("query", new BasicBSONObject());
}
if (query.containsField("sort")) {
queryObject.put("orderby", query.get("sort"));
}
BSONObject lastErrorObject = null;
BSONObject returnDocument = null;
int num = 0;
for (BSONObject document : handleQuery(queryObject, 0, 1)) {
num++;
if (Utils.isTrue(query.get("remove"))) {
removeDocument(document);
returnDocument = document;
} else if (query.get("update") != null) {
BSONObject updateQuery = (BSONObject) query.get("update");
Integer matchPos = matcher.matchPosition(document, (BSONObject) queryObject.get("query"));
BSONObject oldDocument = updateDocument(document, updateQuery, matchPos);
if (returnNew) {
returnDocument = document;
} else {
returnDocument = oldDocument;
}
lastErrorObject = new BasicBSONObject("updatedExisting", Boolean.TRUE);
lastErrorObject.put("n", Integer.valueOf(1));
}
}
if (num == 0 && Utils.isTrue(query.get("upsert"))) {
BSONObject selector = (BSONObject) query.get("query");
BSONObject updateQuery = (BSONObject) query.get("update");
BSONObject newDocument = handleUpsert(updateQuery, selector);
if (returnNew) {
returnDocument = newDocument;
} else {
returnDocument = new BasicBSONObject();
}
num++;
}
if (query.get("fields") != null) {
BSONObject fields = (BSONObject) query.get("fields");
returnDocument = projectDocument(returnDocument, fields);
}
BSONObject result = new BasicBSONObject();
if (lastErrorObject != null) {
result.put("lastErrorObject", lastErrorObject);
}
result.put("value", returnDocument);
Utils.markOkay(result);
return result;
}