如何在MongoDB已有字段中追加数据?针对指定用户更新Title字段
解决方案说明
首先需要修正一个格式问题:你给出的第二次添加后的文档结构是不合法的JSON,正确的做法是将Title字段改为数组类型来存储多个标题,这样MongoDB才能正确处理多值存储。
正确的文档结构示例
第一次添加后:
{ "_id" : ObjectId("53ce11e7d0881d32d9fa935f"), "username" : "hello_stack_overflow", "Title" : ["Batman"] }
第二次添加后:
{ "_id" : ObjectId("53ce11e7d0881d32d9fa935f"), "username" : "hello_stack_overflow", "Title" : ["Batman", "Avengers"] }
基于你提供的Java代码实现功能
你可以使用MongoDB的$push或$addToSet操作符来实现按username添加Title的需求,以下是具体代码:
1. 允许重复添加Title(使用$push)
MongoClient mongoClient = new MongoClient("localhost",27017); DB database = mongoClient.getDB("prog"); DBCollection collection = database.getCollection("Users"); DBObject query = new BasicDBObject("username", username); // 构造更新操作:向Title数组追加新标题 DBObject update = new BasicDBObject("$push", new BasicDBObject("Title", newTitle)); // 执行更新:匹配到对应username的文档则更新,未匹配到则不操作 collection.update(query, update);
2. 避免重复添加Title(使用$addToSet)
如果不想重复添加同一个标题,将$push替换为$addToSet即可:
DBObject update = new BasicDBObject("$addToSet", new BasicDBObject("Title", newTitle)); collection.update(query, update);
3. 处理初始空字符串的情况
如果原文档中Title是空字符串(""),第一次添加时需要先将其转换为数组,可通过以下代码处理:
// 查询对应username的文档 DBObject result = collection.findOne(query); if (result != null) { Object titleValue = result.get("Title"); DBObject update; if (titleValue instanceof String && ((String) titleValue).isEmpty()) { // 空字符串转换为包含新标题的数组 update = new BasicDBObject("$set", new BasicDBObject("Title", Arrays.asList(newTitle))); } else { // 向已有数组追加标题 update = new BasicDBObject("$push", new BasicDBObject("Title", newTitle)); } collection.update(query, update); }
补充说明
- 若希望当
username不存在时自动创建新文档,可以在update方法中添加第三个参数true(开启upsert模式):collection.update(query, update, true, false);
内容的提问来源于stack exchange,提问作者Shalev Levi Sagzan
相关产品推荐
相关产品推荐

