Java + MongoDB:更新文档中的多个字段

时间:2015-10-29 10:49:36

标签: java mongodb

我试图在一个MongoDB文档中立即更新多个字段,但只更新了一个字段。 我有一个用户集合,其中用户由 customer_user_id 唯一定义。我想更新某个用户的 birth_year 国家/地区字段。

这就是我在做的事情:

// Define the search query:
DBCollection col = md.getDb().getCollection("user");
BasicDBObject searchQuery = new BasicDBObject("customer_user_id", customer_user_id);

// Define the update query:
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$set", new BasicDBObject().append("birth_year", birth_year);
updateQuery.append("$set", new BasicDBObject().append("country", country);

log.info("Update query: " + updateQuery);
col.update(searchQuery, updateQuery);

不幸的是,只更新了国家/地区字段,并且记录的updateQuery如下所示:

  

更新查询:{“$ set”:{“country”:“Austria”}}

4 个答案:

答案 0 :(得分:13)

我无法验证,但也许你应该尝试:

BasicDBObject updateFields = new BasicDBObject();
updateFields.append("birth_year", birth_year);
updateFields.append("country", country);
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
col.update(searchQuery, setQuery);

或者我认为这是相同的:

updateQuery.put("$set", new BasicDBObject("country",country).append("birth_year", birth_year));

答案 1 :(得分:5)

对于MongoDB 3.4,您可以使用

df.groupBy('colName').count().toPandas().set_index("count").sort_index(ascending=False)

答案 2 :(得分:3)

或者,com.mongodb.client.model.Updates中有方便的方法可以做到这一点:

MongoCollection<Document> collection = mongoClient.getDatabase("db").getCollection("user");

collection.updateMany(
    Filters.eq("customer_user_id", customer_user_id),
    Updates.combine(
        Updates.set("birth_year", birth_year),
        Updates.set("country", country)
    ));

在此基础上也会创建一个$set的Bson查询,但是使用便捷方法可以使您的代码更清晰易读。

答案 3 :(得分:1)

@pakat对答案的不同...

MongoCollection<Document> collection = mongoClient.getDatabase("db").getCollection("user");

List<Bson> updatePredicates = new ArrayList<Bson>();
Bson predicateBirthYear = set("birth_year", birth_year);
Bson predicateCountry = set("country", country);

updatePredicates.add(predicateBirthYear);
updatePredicates.add(predicateCountry);

collection.updateMany(Filters.eq("customer_user_id", customer_user_id), Updates.combine(updatePredicates));