2012-04-10 16 views
9

Ho JSON come:Rimuovere una voce dalla array usando driver di MongoDB-Java

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

ho bisogno di essere in grado di rimuovere uno dei dischi di ITEMLIST. Ho fatto quanto segue:

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); 

}

Questo approccio non funziona. Tuttavia, quando ho usato BasicDBObject con $ pull, funziona bene! Qual è la differenza tra questi approcci!

+0

L'utilizzo di Bson è simile. Ho messo una [risposta qui] (http://stackoverflow.com/a/37846203/1978082) – HenioJR

risposta

12

Se si desidera rimuovere una serie genere io uso il seguente:

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ì, quello che uso, ma mi chiedevo se posso usare Query con MongoOperations per raggiungere questo obiettivo. – Echo

+0

Grazie, funziona per me. –

4

Il metodo remove dal modello rimuove documento. Se vuoi rimuovere l'elemento dall'array devi usare pull. Qualcosa come

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); 
Problemi correlati