我在MongoDB中有一个包含数千个文档的集合.
每个文档目前都是这样的:
{
"_id" : ObjectId("1"),
"FIELD1" : {
"STR1" : "some text",
"STR2" : "some text",
"STR3" : "some text",
"STR4" : "some text"
},
"FIELD2" : "some text"
}
使用以下代码段,我设法为ALL 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添加多个项目,其中每个项目都是一个包含2个字符串的对象:
{
"_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中.但是,我现在有另一个问题,我有’重复’项,其中值字段是相同的.我不希望这样.
删除重复项的优雅方法是什么?或者,更好的是,只插入非重复的优雅方式是什么?
我之前对重复的问题不太清楚.事实是,不同的项目必须具有不同的名称,例如ITEM1,ITEM2等;否则,他们互相取代.我想比较的是他们的价值观.
如果我将数据存储在不同的结构中会更好/更容易吗?我在想是否可能将FIELD3更改为ArrayList而不是Object.
目前,它类似于以下内容,我希望通过“WATERMELON”字段删除重复的水果.
FRUITS
> FRUIT1
> WATERMELON
> BIG
> FRUIT2
> WaTeRMeLON
> BIG
> FRUIT3
> APPLE
> SMALL
请帮忙!
最佳答案
This post说要为要创建的每个对象使用单独的BasicDBObject.它很冗长,但我还没有找到另一种方法.
BasicDBObject item1 = new BasicDBObject("STR1", "text").append("STR2", "txt");
// also for item2 and item3...
BasicDBObject field3 = new BasicDBObject("ITEM1", item1).append("ITEM2", item2);
update.put("$set", new BasicDBObject("FIELD3", field3));