MongoDb在其java驱动程序中的$ set等价物

时间:2011-02-09 10:15:12

标签: java mongodb

有没有办法可以通过Java Driver修改MongoDb中某个键的值。我尝试了以下内容:

someCollection.update(DBObject query, DBObject update);
someCollection.findAndModify(DBObject query, DBObject update);

但这两个函数都完全用更新的文档替换查询的文档。在mongo shell中使用$ set的情况下,只更新一个特定键的值的方法是什么。(除了创建一个全新的文档,其中复制了所有字段并更新了其中一个字段)。

6 个答案:

答案 0 :(得分:30)

BasicDBObject carrier = new BasicDBObject();
BasicDBObject query = new BasicDBObject();
query.put("YOUR_QUERY_STRING", YOUR_QUERY_VALUE);

BasicDBObject set = new BasicDBObject("$set", carrier);
carrier.put("a", 6);
carrier.put("b", "wx1");        
myColl.updateMany(query, set);

这应该有用,接受的答案不在上面。

答案 1 :(得分:18)

我不是Java专家,但似乎以下代码符合您的需求:

BasicDBObject set = new BasicDBObject("$set", new BasicDBObject("age", 10));
set.append("$set", new BasicDBObject("name", "Some Name");
someCollection.update(someSearchQuery, set);

另请参阅this example

答案 2 :(得分:1)

前面的回答指出了我正确的方向,但是为更新添加第二个对象的代码对我不起作用。以下是:

BasicDBObject newValues = new BasicDBObject("age", 10);
newValues.append("name", "Some Name");
BasicDBObject set = new BasicDBObject("$set", newValues);
collection.update(someSearchQuery, set);

答案 3 :(得分:0)

上面提到的解决方案都不适合我。我意识到查询应该是Document类型而不是BasicDBObject:

Document set = new Document("$set", new Document("firstName","newValue"));

yourMongoCollection.updateOne(new Document("_id",objectId), set);

“yourMongoCollection”的类型为“MongoCollection”,类型为“ObjectId”的“objectId”

答案 4 :(得分:0)

首先,除非我想重新配置/重新格式化/"重新输入"我的价值观我只能使用findAndModify update

以下是c& p用途的完整工作示例...享受:

    Boolean updateValue(DB db, DBCollection collection, String id, String key, Object newValue)
    {
        DBCollection collection = db.getCollection(<collection name>);

        // Identify your required document (id, key, etc...)
        DBObject     query      = new BasicDBObject("_ID",<ID or key value>);
        DBObject     update     = new BasicDBObject("$set", new BasicDBObject(key, newValue));

        //These flags will guarantee that you'lls get the updated result
        DBObject     result     = collection.findAndModify(query, null, null, false, update,true, true);

        //Just for precaution....
        if(result == null)
            return false;

        return result.get(key).equals(newValue);
    }

答案 5 :(得分:0)

根据文档,$set$addFields很有帮助,所以只需使用:

        var iterable = collection.aggregate(Arrays.asList(
                Aggregates.addFields(new Field("foo", "bar"))
        ));