2016-12-25 6 views
2

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

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 работает нормально, но он будет воссоздавать Индекс, если он есть.

+0

Можете ли вы добавить пример, где он не работает? Не уверен, что делает 'convertToDBObjectToUpdate (supcInfo) '. нам даже нужна операция объемной записи, когда все, что вы пытаетесь сделать, это только обновление? – Veeram

+0

Прошу прощения. Это dbObject. Я пытаюсь обновить supcinfo, который содержит от 5 до 7 полей, но он обновляет первый и последний, только означает _id и updateTs. { \t \t "supc": "supc15", \t \t "pogId": 1354619, \t \t "MRP": 3322323, \t \t "цена": 99232323, \t \t "primarySellerCode": "" , \t \t "camsEnabled": правда, \t \t "доступность": "в наличии" \t} – cody123

ответ

1

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

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

BasicDBObject updateFields = new BasicDBObject("pogId", supcInfo.getPogId()).append("mrp", supcInfo.getMrp()); // Rest of fields. 
BasicDBObject dbObject = new BasicDBObject("$set",updateFields); 
+0

Спасибо. Я обнаружил, что ошибся. Однако я обновляюсь в Bulk, потому что будет 100 обновлений в секунду. – cody123