mongodb-query - 使用java驱动程序从mongodb数组中删除字段

标签 mongodb-query mongodb-java

我需要从设备数组中删除所有字段,它们的条件是 state = 0

这是我的 mongodb 文档:

{ "_id" : { "$oid" : "53e53553b76000127cb1ab80"} ,  
  "city" : "Some Place" , 
  "devices" : 
       [ { "guid" : "local" , "brand" : "SSSS" , "state" : 1} , 
         { "guid" : "local2" , "brand" : "DDD" , "state" : 0} , 
         { "guid" : "local2" , "brand" : "DDD" , "state" : 0} ,   
         { "guid" : "local2" , "brand" : "DDD" , "state" : 0}] , 
  "phone": 8888888888,   
  "sex" : "Male"
 }

这是我正在尝试的java代码:

DBCollection collection = db.getCollection(usersCollection);
BasicDBObject query2 = new BasicDBObject("_id", id);
((BasicDBObject) query2).append("devices.guid", device);
((BasicDBObject) query2).append("devices.state", 0);
collection.remove(query2);

但是此查询会从文档中删除所有设备。 提前致谢!

最佳答案

您需要执行相当于:

db.usersCollection.update(
     {"_id":"yourId"}, 
     {$pull: 
            { "devices" : 
                    { $elemMatch : 
                        {
                          "guid":"local2", 
                          "state":"0"
                        }
                    }
            }
     }
)

yourId 替换为您要查询的 ID

也就是说,不要使用 remove,而是使用 update,并在 BasicDBObject 中使用 $pull。我现在无法测试这个,但请尝试:

DBCollection collection = db.getCollection(usersCollection);
BasicDBObject query = new BasicDBObject("_id", id);

BasicDBObject deviceToDelete = new BasicDBObject("guid",device);
deviceToDelete.append("state", "0");

BasicDBObject obj = new BasicDBObject("devices", deviceToDelete);
collection.update(query, new BasicDBObject("$pull",obj));

让我知道这是否有效(我再次无法测试,因为我的机器上没有 mongod)。

关于mongodb-query - 使用java驱动程序从mongodb数组中删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212513/

相关文章:

mongodb - 使用 java mongodb 驱动程序 3.2 的 mapReduce 内联结果

java - MongoDB Java 驱动程序 : query where d>2, a ="ABC",b ="AA"

java - 查询嵌套文档和 atrihute do 变量 (MongoDB Java Driver 3.2)

node.js - 从嵌套数组 mongodb 中删除元素

mongodb - 有没有办法过滤 mongodb 中的嵌入数组?

mongodb - Spring data mongodb nearSphere 不使用 query.with(pageable)

java - 并发更新同一个集契约(Contract)一个文档

mongodb - 比较在 Mongodb 中存储为字符串的整数

node.js - 根据条件从现有字段计算分数

mongodb - $cond 中存在 $exists 的条件分组