@Override com.mongodb.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new com.mongodb.bulk.UpdateRequest(new BsonDocumentWrapper<DBObject>(query, codec), new BsonDocumentWrapper<DBObject>(update, codec), com.mongodb.bulk.WriteRequest.Type.UPDATE) .upsert(isUpsert()) .multi(isMulti()) .collation(getCollation()) .arrayFilters(dbCollection.wrapAllowNull(arrayFilters, codec)); } }
writer.writeStartDocument(); writer.writeName("q"); getCodec(update.getFilter()).encode(writer, update.getFilter(), EncoderContext.builder().build()); writer.writeName("u"); if (update.getType() == WriteRequest.Type.UPDATE && update.getUpdate().isEmpty()) { throw new IllegalArgumentException("Invalid BSON document for an update"); getCodec(update.getUpdate()).encode(writer, update.getUpdate(), EncoderContext.builder().build()); if (update.isMulti()) { writer.writeBoolean("multi", update.isMulti()); if (update.isUpsert()) { writer.writeBoolean("upsert", update.isUpsert()); if (update.getCollation() != null) { writer.writeName("collation"); BsonDocument collation = update.getCollation().asDocument(); getCodec(collation).encode(writer, collation, EncoderContext.builder().build()); if (update.getArrayFilters() != null) { writer.writeStartArray("arrayFilters"); for (BsonDocument cur: update.getArrayFilters()) { getCodec(cur).encode(writer, cur, EncoderContext.builder().build());
@SuppressWarnings("unchecked") private WriteResult replaceOrInsert(final DBObject obj, final Object id, final WriteConcern writeConcern) { DBObject filter = new BasicDBObject(ID_FIELD_NAME, id); UpdateRequest replaceRequest = new UpdateRequest(wrap(filter), wrap(obj, objectCodec), com.mongodb.bulk.WriteRequest.Type.REPLACE).upsert(true); return executeWriteOperation(new UpdateOperation(getNamespace(), false, writeConcern, retryWrites, singletonList(replaceRequest))); }
@Override com.mongodb.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new com.mongodb.bulk.UpdateRequest(new BsonDocumentWrapper<DBObject>(query, codec), new BsonDocumentWrapper<DBObject>(document, replacementCodec), com.mongodb.bulk.WriteRequest.Type.REPLACE) .upsert(isUpsert()) .collation(getCollation()); } }
@Override protected EncodingMetadata encodeMessageBodyWithMetadata(final BsonOutput bsonOutput) { bsonOutput.writeInt32(0); // reserved bsonOutput.writeCString(getCollectionName()); int flags = 0; if (updateRequest.isUpsert()) { flags |= 1; } if (updateRequest.isMulti()) { flags |= 2; } bsonOutput.writeInt32(flags); int firstDocumentStartPosition = bsonOutput.getPosition(); addDocument(updateRequest.getFilter(), bsonOutput, new NoOpFieldNameValidator()); if (updateRequest.getType() == REPLACE) { addDocument(updateRequest.getUpdate(), bsonOutput, new CollectibleDocumentFieldNameValidator()); } else { int bufferPosition = bsonOutput.getPosition(); addDocument(updateRequest.getUpdate(), bsonOutput, new UpdateFieldNameValidator()); if (bsonOutput.getPosition() == bufferPosition + 5) { throw new IllegalArgumentException("Invalid BSON document for an update"); } } return new EncodingMetadata(firstDocumentStartPosition); }
/** {@inheritDoc} */ @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { Object operation = args[0]; final String operationName; if (operation instanceof AggregateOperation<?>) { operationName = Joiner.on(",").join(((AggregateOperation<?>) operation).getPipeline()); } else if (operation instanceof ListIndexesOperation<?>) { operationName = "indexes"; } else if (operation instanceof FindOperation<?>) { FindOperation<?> findOperation = (FindOperation<?>) operation; operationName = "find(" + findOperation.getFilter().toJson() + ")"; } else if (operation instanceof CountOperation) { operationName = "count(" + ((CountOperation) operation).getFilter().toJson() + ")"; } else if (operation instanceof UpdateOperation) { UpdateOperation updateOperation = (UpdateOperation) operation; List<UpdateRequest> updateRequests = updateOperation.getUpdateRequests(); operationName = updateRequests.stream().map(ur -> "{" + ur.getType() + ur.getFilter() + "}").collect(Collectors.joining(",")); } else { operationName = operation.toString(); } return doInvoke(operationExecutor, method, args, operationName); } }
static void validateWriteRequestCollations(final ConnectionDescription connectionDescription, final List<? extends WriteRequest> requests, final WriteConcern writeConcern) { Collation collation = null; for (WriteRequest request : requests) { if (request instanceof UpdateRequest) { collation = ((UpdateRequest) request).getCollation(); } else if (request instanceof DeleteRequest) { collation = ((DeleteRequest) request).getCollation(); } if (collation != null) { break; } } validateCollationAndWriteConcern(connectionDescription, collation, writeConcern); }
@Override protected EncodingMetadata encodeMessageBodyWithMetadata(final BsonOutput bsonOutput) { bsonOutput.writeInt32(0); // reserved bsonOutput.writeCString(getCollectionName()); int flags = 0; if (updateRequest.isUpsert()) { flags |= 1; } if (updateRequest.isMulti()) { flags |= 2; } bsonOutput.writeInt32(flags); int firstDocumentStartPosition = bsonOutput.getPosition(); addDocument(updateRequest.getFilter(), bsonOutput, new NoOpFieldNameValidator()); if (updateRequest.getType() == REPLACE) { addDocument(updateRequest.getUpdate(), bsonOutput, new CollectibleDocumentFieldNameValidator()); } else { int bufferPosition = bsonOutput.getPosition(); addDocument(updateRequest.getUpdate(), bsonOutput, new UpdateFieldNameValidator()); if (bsonOutput.getPosition() == bufferPosition + 5) { throw new IllegalArgumentException("Invalid BSON document for an update"); } } return new EncodingMetadata(firstDocumentStartPosition); }
@Override com.mongodb.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new com.mongodb.bulk.UpdateRequest(new BsonDocumentWrapper<DBObject>(query, codec), new BsonDocumentWrapper<DBObject>(document, replacementCodec), com.mongodb.bulk.WriteRequest.Type.REPLACE) .upsert(isUpsert()) .collation(getCollation()); } }
@SuppressWarnings("unchecked") private WriteResult replaceOrInsert(final DBObject obj, final Object id, final WriteConcern writeConcern) { DBObject filter = new BasicDBObject(ID_FIELD_NAME, id); UpdateRequest replaceRequest = new UpdateRequest(wrap(filter), wrap(obj, objectCodec), com.mongodb.bulk.WriteRequest.Type.REPLACE).upsert(true); return executeWriteOperation(new UpdateOperation(getNamespace(), false, writeConcern, retryWrites, singletonList(replaceRequest))); }
static void validateWriteRequestCollations(final ConnectionDescription connectionDescription, final List<? extends WriteRequest> requests, final WriteConcern writeConcern) { Collation collation = null; for (WriteRequest request : requests) { if (request instanceof UpdateRequest) { collation = ((UpdateRequest) request).getCollation(); } else if (request instanceof DeleteRequest) { collation = ((DeleteRequest) request).getCollation(); } if (collation != null) { break; } } validateCollationAndWriteConcern(connectionDescription, collation, writeConcern); }
/** * Modify an existing document or documents in collection. * * @param query the selection criteria for the update * @param update the modifications to apply * @param options the options to apply to the update operation * @return the result of the operation * @throws com.mongodb.DuplicateKeyException if the write failed to a duplicate unique key * @throws com.mongodb.WriteConcernException if the write failed due some other failure specific to the update command * @throws MongoException if the operation failed for some other reason * @mongodb.driver.manual tutorial/modify-documents/ Modify * @since 3.4 */ public WriteResult update(final DBObject query, final DBObject update, final DBCollectionUpdateOptions options) { notNull("query", query); notNull("update", update); notNull("options", options); WriteConcern writeConcern = options.getWriteConcern() != null ? options.getWriteConcern() : getWriteConcern(); com.mongodb.bulk.WriteRequest.Type updateType = !update.keySet().isEmpty() && update.keySet().iterator().next().startsWith("$") ? com.mongodb.bulk.WriteRequest.Type.UPDATE : com.mongodb.bulk.WriteRequest.Type.REPLACE; UpdateRequest updateRequest = new UpdateRequest(wrap(query), wrap(update, options.getEncoder()), updateType) .upsert(options.isUpsert()).multi(options.isMulti()) .collation(options.getCollation()) .arrayFilters(wrapAllowNull(options.getArrayFilters(), options.getEncoder())); return executeWriteOperation(new UpdateOperation(getNamespace(), true, writeConcern, retryWrites, singletonList(updateRequest)).bypassDocumentValidation(options.getBypassDocumentValidation())); }
writer.writeStartDocument(); writer.writeName("q"); getCodec(update.getFilter()).encode(writer, update.getFilter(), EncoderContext.builder().build()); writer.writeName("u"); if (update.getType() == WriteRequest.Type.UPDATE && update.getUpdate().isEmpty()) { throw new IllegalArgumentException("Invalid BSON document for an update"); getCodec(update.getUpdate()).encode(writer, update.getUpdate(), EncoderContext.builder().build()); if (update.isMulti()) { writer.writeBoolean("multi", update.isMulti()); if (update.isUpsert()) { writer.writeBoolean("upsert", update.isUpsert()); if (update.getCollation() != null) { writer.writeName("collation"); BsonDocument collation = update.getCollation().asDocument(); getCodec(collation).encode(writer, collation, EncoderContext.builder().build()); if (update.getArrayFilters() != null) { writer.writeStartArray("arrayFilters"); for (BsonDocument cur: update.getArrayFilters()) { getCodec(cur).encode(writer, cur, EncoderContext.builder().build());
} else if (writeModel instanceof ReplaceOneModel) { ReplaceOneModel<TDocument> replaceOneModel = (ReplaceOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(replaceOneModel.getFilter()), documentToBsonDocument(replaceOneModel .getReplacement()), WriteRequest.Type.REPLACE) .upsert(replaceOneModel.getReplaceOptions().isUpsert()) .collation(replaceOneModel.getReplaceOptions().getCollation()); } else if (writeModel instanceof UpdateOneModel) { UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(updateOneModel.getFilter()), toBsonDocument(updateOneModel.getUpdate()), WriteRequest.Type.UPDATE) .multi(false) .upsert(updateOneModel.getOptions().isUpsert()) .collation(updateOneModel.getOptions().getCollation()) .arrayFilters(toBsonDocumentList(updateOneModel.getOptions().getArrayFilters())); } else if (writeModel instanceof UpdateManyModel) { UpdateManyModel<TDocument> updateManyModel = (UpdateManyModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(updateManyModel.getFilter()), toBsonDocument(updateManyModel.getUpdate()), WriteRequest.Type.UPDATE) .multi(true) .upsert(updateManyModel.getOptions().isUpsert()) .collation(updateManyModel.getOptions().getCollation()) .arrayFilters(toBsonDocumentList(updateManyModel.getOptions().getArrayFilters())); } else if (writeModel instanceof DeleteOneModel) { DeleteOneModel<TDocument> deleteOneModel = (DeleteOneModel<TDocument>) writeModel;
@Override com.mongodb.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new com.mongodb.bulk.UpdateRequest(new BsonDocumentWrapper<DBObject>(query, codec), new BsonDocumentWrapper<DBObject>(update, codec), com.mongodb.bulk.WriteRequest.Type.UPDATE) .upsert(isUpsert()) .multi(isMulti()) .collation(getCollation()) .arrayFilters(dbCollection.wrapAllowNull(arrayFilters, codec)); } }
/** * Modify an existing document or documents in collection. * * @param query the selection criteria for the update * @param update the modifications to apply * @param options the options to apply to the update operation * @return the result of the operation * @throws com.mongodb.DuplicateKeyException if the write failed to a duplicate unique key * @throws com.mongodb.WriteConcernException if the write failed due some other failure specific to the update command * @throws MongoException if the operation failed for some other reason * @mongodb.driver.manual tutorial/modify-documents/ Modify * @since 3.4 */ public WriteResult update(final DBObject query, final DBObject update, final DBCollectionUpdateOptions options) { notNull("query", query); notNull("update", update); notNull("options", options); WriteConcern writeConcern = options.getWriteConcern() != null ? options.getWriteConcern() : getWriteConcern(); com.mongodb.bulk.WriteRequest.Type updateType = !update.keySet().isEmpty() && update.keySet().iterator().next().startsWith("$") ? com.mongodb.bulk.WriteRequest.Type.UPDATE : com.mongodb.bulk.WriteRequest.Type.REPLACE; UpdateRequest updateRequest = new UpdateRequest(wrap(query), wrap(update, options.getEncoder()), updateType) .upsert(options.isUpsert()).multi(options.isMulti()) .collation(options.getCollation()) .arrayFilters(wrapAllowNull(options.getArrayFilters(), options.getEncoder())); return executeWriteOperation(new UpdateOperation(getNamespace(), true, writeConcern, retryWrites, singletonList(updateRequest)).bypassDocumentValidation(options.getBypassDocumentValidation())); }
} else if (writeModel instanceof ReplaceOneModel) { ReplaceOneModel<TDocument> replaceOneModel = (ReplaceOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(replaceOneModel.getFilter()), documentToBsonDocument(replaceOneModel .getReplacement()), WriteRequest.Type.REPLACE) .upsert(replaceOneModel.getReplaceOptions().isUpsert()) .collation(replaceOneModel.getReplaceOptions().getCollation()); } else if (writeModel instanceof UpdateOneModel) { UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(updateOneModel.getFilter()), toBsonDocument(updateOneModel.getUpdate()), WriteRequest.Type.UPDATE) .multi(false) .upsert(updateOneModel.getOptions().isUpsert()) .collation(updateOneModel.getOptions().getCollation()) .arrayFilters(toBsonDocumentList(updateOneModel.getOptions().getArrayFilters())); } else if (writeModel instanceof UpdateManyModel) { UpdateManyModel<TDocument> updateManyModel = (UpdateManyModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(updateManyModel.getFilter()), toBsonDocument(updateManyModel.getUpdate()), WriteRequest.Type.UPDATE) .multi(true) .upsert(updateManyModel.getOptions().isUpsert()) .collation(updateManyModel.getOptions().getCollation()) .arrayFilters(toBsonDocumentList(updateManyModel.getOptions().getArrayFilters())); } else if (writeModel instanceof DeleteOneModel) { DeleteOneModel<TDocument> deleteOneModel = (DeleteOneModel<TDocument>) writeModel;