2015-04-13 7 views
0

Я пытаюсь выполнить массовое upsert с использованием BulkWriteOperation.Массовое upsert с использованием MongoDb BulkWriteOperation throwing IllegalArgumentException

public BulkWriteResult bulkUpsert(DomainName domainName, Map<DBObject, DBObject> dbObjectByQueryMap) { 

    BulkWriteOperation bulkWriteOperation = mongoCollectionPool.collection(domainName).initializeOrderedBulkOperation(); 

    for (Map.Entry<DBObject, DBObject> entry : dbObjectByQueryMap.entrySet()) { 
    bulkWriteOperation.find(entry.getKey()).upsert().updateOne(entry.getValue()); 
    } 
    BulkWriteResult result = bulkWriteOperation.execute(); 
    if (result.getMatchedCount() <= 0) 
    throw new DomainNotFoundException(String.format("Could not upsert %s .", domainName.toString())); 

    return result; 

}

карта имеет ключ в качестве запроса и значение в качестве DBObject (Java Bean). Этот метод бросает IlllegalArgumentException ?.

Вот StackTrace

java.lang.IllegalArgumentException: Invalid BSON field name code 
at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:494) 
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:127) 
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61) 
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63) 
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29) 
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:83) 
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:42) 
at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBody(BaseWriteCommandMessage.java:112) 
at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBody(BaseWriteCommandMessage.java:35) 
at com.mongodb.connection.RequestMessage.encode(RequestMessage.java:132) 
at com.mongodb.connection.BaseWriteCommandMessage.encode(BaseWriteCommandMessage.java:89) 
at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:170) 
at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:73) 
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:63) 
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37) 
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:155) 
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:219) 
at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:120) 
at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:440) 
at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:604) 
at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:361) 
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:148) 
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:141) 
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:186) 
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:177) 
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:141) 
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:72) 
at com.mongodb.Mongo.execute(Mongo.java:745) 
at com.mongodb.Mongo$2.execute(Mongo.java:728) 
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1968) 
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1962) 
at com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:98) 

Вот мой документ выглядит как

{ 
    "code": "KRK", 
    "countryCode": "IN", 
    "latitude": 45.0667, 
    "longitude": 14.6000, 
    "timeZoneOffsetId": "507f1f77bcf86cd799439011" 
} 

и запрос

new QueryBuilder().put("code").is("KRK").get() 

И Бин

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.mongodb.BasicDBObject; 
import com.mongodb.DBObject; 
import com.openapi.rest.Airport; 
import lombok.NoArgsConstructor; 
import org.bson.BSONObject; 
import java.util.Map; 
import java.util.Set; 
@NoArgsConstructor 
public class MongoAirport implements Airport,DBObject { 
    private DBObject realObject; 
    public MongoAirport() { 
    this.realObject = new BasicDBObject(); 
    } 


private String countryCode; 
    private Double latitude; 
    private Double longitude; 
    private String timeZoneOffsetId; 
    private String code; 
    @Override public String getCode() { 
     return code; 
    } 
    @Override public void setCode(String code) { 
     this.code = code; 
    } 
    @Override public String getCountryCode() { 
     return countryCode; 
    } 
    @Override public void setCountryCode(String countryCode) { 
     this.countryCode = countryCode; 
    } 

    @Override public Double getLatitude() { 
     return latitude; 
    } 
    @Override public void setLatitude(Double latitude) { 
     this.latitude = latitude; 
    } 
    @Override public Double getLongitude() { 
     return longitude; 
    } 
    @Override public void setLongitude(Double longitude) { 
     this.longitude = longitude; 
    } 
    @Override public String getTimeZoneOffsetId() { 
     return timeZoneOffsetId; 
    } 
    @Override public void setTimeZoneOffsetId(String timeZoneOffsetId) { 
     this.timeZoneOffsetId = timeZoneOffsetId; 
    } 
    @JsonIgnore 
    @Override public void markAsPartialObject() { 
     realObject.markAsPartialObject(); 
    } 

    @JsonIgnore 
    @Override public boolean isPartialObject() { 
     return realObject.isPartialObject(); 
    } 

    @JsonIgnore 
    @Override public Object put(String key, Object v) { 
     return realObject.put(key, v); 
    } 
    @JsonIgnore 
    @Override public void putAll(BSONObject o) { 
     realObject.putAll(o); 
    } 
    @JsonIgnore 
    @Override public void putAll(Map m) { 
     realObject.putAll(m); 
    } 

    @JsonIgnore 
    @Override public Object get(String key) { 
     return realObject.get(key); 
    } 
    @JsonIgnore 
    @Override public Map toMap() { 
     return realObject.toMap(); 
    } 
    @JsonIgnore 
    @Override public Object removeField(String key) { 
     return realObject.removeField(key); 
    } 
    @JsonIgnore 
    @Override public boolean containsKey(String s) { 
     return realObject.containsKey(s); 
    } 
    @JsonIgnore 
    @Override public boolean containsField(String s) { 
     return realObject.containsField(s); 
    } 
    @JsonIgnore 
    @Override public Set<String> keySet() { 

     return realObject.keySet(); 
    } 
} 

Можете ли вы помочь мне разобраться с проблемой ?.

+0

Anything неясного с«java.lang.IllegalArgumentException: Invalid поля BSON имя *** код *** "? –

+0

Кроме того, компонент Data Bean должен быть включен. Пожалуйста, прочитайте http://stackoverflow.com/help/mcve. –

+0

Обновлено с помощью bean-компонента –

ответ

1

Я нашел ответ на свой вопрос. мне нужно изменить для цикла

for (Map.Entry<BasicDBObject, DBObject> entry : dbObjectByQueryMap.entrySet()) { 
     bulkWriteOperation.find(entry.getKey()).upsert().updateOne(new BasicDBObject("$set", entry.getValue())); 
     } 

Вместо

entry.getValue() 

Я добавил

new BasicDBObject("$set", entry.getValue()) 

`