`我试图更新mongoDB集合中的动态字段,但它给出错误,但得到错误“无法在元素{newDataList:[ { link:“/products/deepak-test”,price:123.45,普里德:“123456789”,产品类型:“室内”,数量:1.0,运输:“true”,标题:“迪帕克测试”} ]}",详细信息={ }}]。at com.mongodb.connection.BulkWriteBatchCombiner.getError(BulkWriteBatchCombiner.java:176)“
code:Document findQuery = new Document(“siteId”,siteId).append(“prid”,prid);
LinkedTreeMap<String,Object> newDatamap =(LinkedTreeMap)productList.get(“new_data”);
for (Map.Entry<String, Object> entry : newDatamap.entrySet()) {
activityDocument.put("newDataList."+entry.getKey(),entry.getValue());
}
update = new Document("$set", activityDocument);
UpdateOneModel<Document> updateOneModel = new UpdateOneModel<>(findQuery, update);
mongoBatcher.insert((Integer.parseInt(clientId)), cmapDetails[0], "productCatalouge", cmapDetails[2], updateOneModel, this.requestId);
code:“LinkedTreeMap<String,Object> newDatamap =(LinkedTreeMap)productList.get(“new_data”);
db.productCatalouge.find({"prid":"123456789"})
[
{
_id: ObjectId("651fb0e0cfee1daa261083db"),
prid: '123456789',
siteId: '910fb5db4172feb74e36d111285fa8cb',
newDataList: [
{
link: '/products/deepak-test',
price: 123.45,
prid: '123456789',
product_type: 'Indoor',
quantity: 1,
shipping: 'true',
title: 'Deepak Test'
}
]
}
]
data ::
at java.lang.Thread.run(Thread.java:750)
2023-10-06 13:27:40,397 ERROR MongoTaskManagerPoolThread-1 MongoDao:236 - Failed record Index: 0, Record: UpdateOneModel{filter=Document{{siteId=910fb5db4172feb74e36d111285fa8cb, prid=123456789}}, update=Document{{$set=Document{{newDataList.price=123.45, newDataList.prid=123456789, newDataList.quantity=13.0, newDataList.shipping=false, newDataList.title=Test After g Incremental}}}}, options=UpdateOptions{upsert=false, bypassDocumentValidation=null, collation=null, arrayFilters=null}} Retrying ...
1条答案
按热度按时间twh00eeo1#
MongoDB中的错误代码28,特别是“无法创建字段”错误,通常发生在您尝试向集合中的文档添加新字段时,但文档的结构不允许创建该字段。发生此错误可能有以下几个原因:
1.架构不匹配:您尝试添加的字段可能与文档的现有架构不兼容。例如,您可能试图将字符串添加到最初包含数值的字段中。
1.严格架构模式:MongoDB的默认行为是灵活使用模式,但如果您使用的是“严格”模式(这不是默认模式),则无法添加模式中未显式定义的字段。
1.文档大小限制:MongoDB的最大文档大小限制为16MB。如果添加新字段会超过此限制,则会出现错误。
要解决此问题,您可以考虑以下步骤:
1.检查现有架构:确保文档的现有架构允许添加新字段。如有必要,请修改架构以容纳新字段。
1.更新现有文档:如果要将字段添加到现有文档中,可能需要遍历集合并单独更新每个文档。这可以使用
$set
操作符来更新特定字段。下面是一个MongoDB shell的例子:将
collection
替换为您的实际集合名称,将newField
替换为您要添加的字段的名称,将"someValue"
替换为您要为新字段设置的值。1.使用
$unset
:如果你想删除一个字段,你可以使用$unset
操作符。举例来说:这将从集合中的所有文档中删除
unwantedField
。1.考虑使用迁移:对于更复杂的模式更改,请考虑使用迁移框架或脚本来管理对数据模型的更改。这有助于确保模式更新期间的数据一致性。
请记住在进行重大架构更改之前备份数据,以避免数据丢失。