我需要从设备数组中删除所有字段,它们的条件是 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/