【问题标题】:MongoDb's $set equivalent in its java DriverMongoDb 在其 java 驱动程序中的 $set 等效项
【发布时间】:2011-02-09 10:15:12
【问题描述】:

有没有一种方法可以通过其 Java 驱动程序修改 MongoDb 中某个键的值。我尝试了以下方法:

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

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

【问题讨论】:

    标签: java mongodb


    【解决方案1】:
    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);
    

    这应该可以,被接受的答案不在上面。

    【讨论】:

    【解决方案2】:

    试试这样的:

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

    也请看this example

    【讨论】:

    • 第二个语句是干什么用的? com.mongodb.DBCollection 类中似乎没有名为 append 的函数。但是如果没有第二条语句,它就可以正常工作。谢谢
    • 第二条语句表明您可以在单个更新中添加任意数量的“集合”。这是我的错误,而不是 someCollection.append 应该设置.append,我更新了我的答案。
    • 您好,这不是正确的答案,它只会设置最后一个值。请参阅我在下面发布的答案
    • Yekmer Simsek 是对的。您的代码只会更新最后一个。
    • @astonia,这个答案现在正确吗?我不认为这个答案和 Yekmer 的有什么区别
    【解决方案3】:

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

    Document set = new Document("$set", new Document("firstName","newValue"));
    
    yourMongoCollection.updateOne(new Document("_id",objectId), set);
    

    其中“yourMongoCollection”属于“MongoCollection”类型,“objectId”属于“ObjectId”类型

    【讨论】:

      【解决方案4】:

      上一个答案为我指明了正确的方向,但是将第二个对象添加到更新中的代码对我不起作用。以下是:

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

      【讨论】:

        【解决方案5】:

        首先,除非我想重新配置/重新格式化/“重新输入”我的值,否则我只会使用 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);
            }
        

        【讨论】:

          【解决方案6】:

          根据文档,$set$addFields 的别名,所以只需使用它:

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

          【讨论】:

            猜你喜欢
            • 2016-07-10
            • 2016-03-13
            • 2012-04-11
            • 2016-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-16
            • 1970-01-01
            相关资源
            最近更新 更多