Невозможно массово обновить mongo с помощью updateone с upsert

Я столкнулся с проблемой. Я пытаюсь обновить, если он уже существует, еще вставьте, если его нет. Я использую Bulk API драйвера spring-mongo.

DBCollection dbCollection = mongoTemplate.getCollection("supcInfo");
        BulkWriteOperation bulkWriteOperation = dbCollection.initializeUnorderedBulkOperation();
BulkUpdateRequestBuilder builder = bulkWriteOperation.find(new BasicDBObject("_id", supcInfo.getSupc())).upsert();
BasicDBObject dbObject = new BasicDBObject("$set",new BasicDBObject("_id", supcInfo.getSupc()));
         dbObject = dbObject.append("$set",new BasicDBObject("pogId", supcInfo.getPogId()));
         dbObject = dbObject.append("$set",new BasicDBObject("mrp", supcInfo.getMrp()));
         dbObject = dbObject.append("$set",new BasicDBObject("price", supcInfo.getPrice()));
         dbObject = dbObject.append("$set",new BasicDBObject("primarySellerCode", supcInfo.getPrimarySellerCode()));
         dbObject =  dbObject.append("$set",new BasicDBObject("camsEnabled", supcInfo.isCamsEnabled()));
         dbObject =  dbObject.append("$set",new BasicDBObject("availability", supcInfo.getAvailability()));
         dbObject = dbObject.append("$set",new BasicDBObject("updateTs", supcInfo.getUpdateTs()));
builder.updateOne(dbObject);
bulkWriteOperation.execute();

Но не все поля обновляются. Может ли кто-нибудь сказать мне причину, и replaceOne работает нормально, но он воссоздает индекс, если он есть.


person cody123    schedule 25.12.2016    source источник
comment
Можете добавить пример, когда он не работает? Не уверен, что делаетconvertToDBObjectToUpdate(supcInfo). нужна ли нам вообще операция массовой записи, когда все, что вы пытаетесь сделать, это только обновление?   -  person s7vr    schedule 25.12.2016
comment
Мне жаль. Это dbObject. Я пытаюсь обновить supcinfo, который содержит от 5 до 7 полей, но он обновляет первое и последнее, означает только _id и updateTs. {supc: supc15, pogId: 1354619, mrp: 3322323, price: 99232323, primarySellerCode:, camsEnabled: true, availability: in stock}   -  person cody123    schedule 25.12.2016


Ответы (1)


Здесь вам не нужны операции массовой записи. Вы можете использовать обычное обновление, и все будет в порядке.

Вы неправильно используете DBObject. Вы перезаписываете ключ $ set.

BasicDBObject updateFields = new BasicDBObject("pogId", supcInfo.getPogId()).append("mrp", supcInfo.getMrp()); // Rest of fields.
BasicDBObject dbObject = new BasicDBObject("$set",updateFields);
person s7vr    schedule 25.12.2016
comment
Спасибо. Я обнаружил, где делал ошибку. Однако я обновляю массово, потому что будет 100 обновлений в секунду. - person cody123; 25.12.2016