此例外情况:
Exception in thread "Thread-1" java.lang.IllegalArgumentException: Invalid BSON field name id
at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:516)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:188)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:131)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
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:85)
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:43)
at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129)
at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:220)
at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101)
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64)
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37)
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:143)
at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:490)
at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:656)
at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:409)
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:177)
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:168)
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:422)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:413)
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168)
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)
at com.mongodb.Mongo.execute(Mongo.java:845)
at com.mongodb.Mongo$2.execute(Mongo.java:828)
at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:550)
at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:542)
at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:381)
at org.hpms.gis.MongoDbTest.insert(MongoDbTest.java:63)
at java.lang.Thread.run(Thread.java:748)
由以下代码引发:
final UUID id = UUID.randomUUID();
final double frequency = 8_000.0 + ( 10_000.0 * Math.random() );
final double startSec = 100*i;
final double startNano = 10*i;
final double endSec = startSec + ( 100*i );
final double endNano = startNano + ( 10*i );
final double latitude = ( 180.0*Math.random() ) - 90.0;
final double longitude = ( 360.0*Math.random() ) - 180.0;
final Document trackID = new Document(
"id", new Document(
"msb", id.getMostSignificantBits ()) .append(
"lsb", id.getLeastSignificantBits()));
final Document track = new Document(
"id", new Document(
"msb", id.getMostSignificantBits ()) .append(
"lsb", id.getLeastSignificantBits())).append(
"frequency", frequency ) .append(
"start", new Document(
"seconds", startSec ) .append(
"nanoSec", startNano )).append(
"end", new Document(
"seconds", endSec ) .append(
"nanoSec", endNano )).append(
"position", new Document(
"latitude" , latitude ) .append(
"longitude", longitude )).append(
"padding", new byte[1000-8-8-8-4-4-4-4-8-8] );
//_collection.insertOne( track );
_collection.updateOne(
trackID,
track,
new UpdateOptions().upsert( true ));
注释代码\u集合。插入器(轨道)
执行良好。
为什么插入是好的,而“向上插入”不是好的?
另一个选项是setOnInsert
,如MongoDB的文档所示:
https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/
只有当upsert
为true
时,该操作才起作用。
在您的情况下,您应该在一个文档中放置不修改的字段,在另一个文档中放置要更新的字段,在第三个文档中,分别将$setOnInsert
和$set
前置为键。
$setOnInrett
的一大优点是,在插入时,它将执行$setOnInrett
和$set
部分,但在更新时,只会执行$set
。
例如,我们有一个要插入/更新的文档,它有5个字段:name
,age
,gender
,createAt
,updateAt
。
createAt
和updateAt
。我所做的是:
query = Filters.eq("name", nameToSearch);
Document upsert = new Document();
Date now = new Date();
//only fields not mentioned in "$set" is needed here
Document toInsert = new Document()
.append("age", newAge)
.append("gender", genderString)
.append("createAt", now);
//the fields to update here, whether on insert or on update.
Document toUpdate = new Document().append("name", nameToSearch)
.append("updateAt", now);
//will:
// - insert 5 fields if query returns no match
// - updates 2 fields if query returns match
upsert.append("$setOnInsert", toInsert)
.append("$set", toUpdate);
UpdateResult result = collection.updateOne(query, toUpdate,
new UpdateOptions().upsert(true));
updateOne
用于使用更新运算符更新文档字段。您需要replaceOne
,它接受替换文档。
_collection.replaceOne(
trackID,
track,
new UpdateOptions().upsert( true ));
更多
更新运算符:https://docs.mongodb.com/manual/reference/operator/update-field/
更新一:https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/
替换一个:https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/
问题内容: 例外情况: 由以下代码引发: 注释的代码执行正常。 为什么在“ upsert”不正确的情况下插入是正确的? 问题答案: 使用更新运算符更新文档字段。您需要哪个带替换文件。 这里更多 更新操作员:https : //docs.mongodb.com/manual/reference/operator/update- field/ 更新一:https : //docs.mongodb.co
我在MongoDB文档模型上使用Azure CosmoDB,并且在使用DBRefs$id更新一些文档时遇到奇怪的行为 看看这个脚本示例: 然后返回: 如果有人知道发生了什么,我真的很感激。
我有以下代码: 出于某种原因,代码有时工作正常,有时则不正常,调试后我注意到当它不工作时,Datareader在其“HasRow”方法上有一个异常,特别是无效数字异常。我尝试直接在DBMS上运行结果查询,它执行得很好,有人知道为什么会发生这种异常吗?我错过了什么?。
问题内容: 背景:我正在编写一个简单的UDP应用程序对我管理的beta服务器执行ping操作,以便告诉我它仍然可以正常运行(我无法对那些想知道的服务器启用ping操作)。我打算在手机上运行此命令,以在服务器不再响应时警告我。 我试图像这样使用看似简单的java.net.DatagramSocket: 我还要说一句,我已通过android清单启用了Internet权限,如果删除了use子句,则会出现
问题内容: 我正在Play 2.1中尝试使用BCrypt实现身份验证。Java应用程序,但是在尝试对用户进行身份验证时会遇到问题。 这是我的堆栈跟踪 我正在使用以下Maven存储库:http : //mvnrepository.com/artifact/org.mindrot/jbcrypt/0.3m 我的代码基于文档,因此 用于保存密码(我还在检查密码是否为空) 为了检查输入的密码是否正确,其中
我正在尝试更改!doctype但仍然不能工作 我的test.java