我有一个MongoDB的集合,其中有数千个文档。 每个文档目前看起来像这样:
{
"_id" : ObjectId("1"),
"FIELD1" : {
"STR1" : "some text",
"STR2" : "some text",
"STR3" : "some text",
"STR4" : "some text"
},
"FIELD2" : "some text"
}
使用以下代码片段,我成功地向所有4000多个文档中添加了一个新字段:
// Add new field to all documents
BasicDBObject query = new BasicDBObject();
BasicDBObject update = new BasicDBObject();
update.put("$set", new BasicDBObject(NEW_DB_FIELD_NAME, new BasicDBObject()));
WriteResult result = coll.update(query, update, true, true);
这份文件有一个新的结构,其中FIELD3
是一个Object
对象:
{
"_id" : ObjectId("1"),
"FIELD1" : {
"STR1" : "some text",
"STR2" : "some text",
"STR3" : "some text",
"STR4" : "some text"
},
"FIELD2" : "some text",
"FIELD3" : {
}
}
现在的问题是我希望将多个项添加到FIELD3
中,每个项都是一个包含两个String
的Object
:
{
"_id" : ObjectId("1"),
"FIELD1" : {
"STR1" : "some text",
"STR2" : "some text",
"STR3" : "some text",
"STR4" : "some text"
},
"FIELD2" : "some text",
"FIELD3" : {
"ITEM1" : {
"STR1" : "",
"STR2" : ""
},
"ITEM2" : {
"STR1" : "",
"STR2" : ""
},
"ITEM3" : {
"STR1" : "",
"STR2" : ""
}
}
}
我尝试过以下方法:
BasicDBObject query = new BasicDBObject{"FIELD2","some text"};
BasicDBObject update = new BasicDBObject();
update.put("$set", new BasicDBObject("FIELD3.ITEM1.STR1", "some text").append("FIELD3.ITEM1.STR2", "some text");
result = coll.update(query, update, true, false);
问题在于我只能在
FIELD3
下获取一个新项目。当我循环遍历项目时,它会不断被新值替换。请帮忙!
更新:
在@Explosion Pills的帮助下,我已经成功将所有
ITEM1
,ITEM2
,ITEM3
等添加到了我新创建的FIELD3
中。然而,现在我又有了另一个问题,即存在“重复”项,其中value
字段相同。我不想要那样。有没有一种优雅的方法来删除重复项?或者更好的是,有没有一种优雅的方法只插入非重复项?
我之前对重复问题表述不够清楚。问题在于,不同的项目必须具有不同的名称,例如ITEM1、ITEM2等;否则,它们会互相替换。我希望比较的是它们的
value
。如果我将数据存储在不同的结构中,会不会更好/更容易?我在思考,也许应该将FIELD3改为
ArrayList
而不是Object
。
目前,它类似于以下内容,我希望从中删除具有“WATERMELON”字段的重复水果。FRUITS
> FRUIT1
> WATERMELON
> BIG
> FRUIT2
> WaTeRMeLON
> BIG
> FRUIT3
> APPLE
> SMALL
请帮忙!