2012-04-10 17 views
9

tengo JSON como:eliminar una entrada de matriz utilizando controlador MongoDB en Java

{ 
    "_id" : "1", 
    "_class" : "com.model.Test", 
    "itemList" : [ 
     { 
      "itemID" : "1", 
      "itemName" : "Foo", 
      "resources" : [ 
       { 
        "resourceID" : "1", 
        "resourceName" : "Foo Test1" 
       }, { 
        "resourceID" : "2", 
        "resourceName" : "Foo Test2" 
       } 
      ] 
     } 
    ] 
} 

Tengo que ser capaz de eliminar uno de los registros de elementoLista. he hecho lo siguiente:

public void removeItemByID(String docID, String itemID) throws Exception { 
    MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate(); 
    Query query = new Query(where("_id").is(docID).and("itemList.itemID").is(itemID)); 
    mongoOperations.remove(query, Item.class); 

}

Este enfoque no funciona. Sin embargo, cuando he usado el enfoque BasicDBObject con $ pull ¡funciona bien! ¡Cuál es la diferencia entre estos enfoques!

+0

El uso de Bson es similar. Puse una [respuesta aquí] (http://stackoverflow.com/a/37846203/1978082) – HenioJR

Respuesta

12

Si desea eliminar una matriz generalmente uso el siguiente:

BasicDBObject match = new BasicDBObject("_id", "1"); // to match your document 
BasicDBObject update = new BasicDBObject("itemList", new BasicDBObject("itemID", "1")); 
coll.update(match, new BasicDBObject("$pull", update)); 
+1

Sí, eso es lo que uso pero me preguntaba si puedo usar Query con MongoOperations para lograrlo. – Echo

+0

Gracias, es para mí. –

4

El método remove quita de la plantilla de documento. Si desea eliminar el elemento de la matriz, debe utilizar la función de extracción. Algo así como

MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate(); 
Query query = new Query(where("_id").is(docID).and("itemList.itemID").is(itemID)); 
Update update = new Update().pull("itemList", new BasicDBObject("itemID", "1")); 
mongoOperations.updateFirst(query, update, Item.class); 
Cuestiones relacionadas