This is an excerpt from the Scala Cookbook. This is Recipe 16.8, “How to delete documents in a MongoDB with Casbah.”
Problem
You want to delete one or more documents in a MongoDB collection in a Scala application.
Solution
Use the findAndRemove
method of the Casbah MongoCollection
class to delete one document at a time, or use the remove
method to delete one or more documents at a time.
The following code uses findAndRemove
to delete the document whose symbol field is AAPL:
val query = MongoDBObject("symbol" -> "AAPL") val result = collection.findAndRemove(query) println("result: " + result)
When a document is deleted, the findAndRemove
method returns the document that was deleted, wrapped in a Some
:
result: Some({ "_id" : { "$oid" : "50255d1d03644925d83b3d07"}, "symbol" : "AAPL" , "price" : 600.0})
If nothing is deleted, such as when you try to delete a document that doesn’t exist, the result is None
:
result: None
Therefore, you’ll probably want to handle this using a match
expression, as shown in the previous recipe.
To delete multiple documents from the collection, specify your search criteria when using the remove
method, such as deleting all documents whose price
field is greater than 500
:
collection.remove("price" $gt 500)
The following method is dangerous: it shows how to delete all documents in the current collection:
// removes all documents def deleteAllObjectsFromCollection(coll: MongoCollection) { coll.remove(MongoDBObject.newBuilder.result) }
(Be careful with that one.)
Discussion
If you’ve been following along with the MongoDB recipes in this chapter, you can experiment with these approaches by saving the following code to a file named DeleteApple.scala in the root directory of your SBT project:
import com.mongodb.casbah.Imports._ object DeleteApple extends App { var collection = MongoFactory.collection // delete AAPL val query = MongoDBObject("symbol" -> "AAPL") val result = collection.findAndRemove(query) println("result: " + result) }
You can also clone my complete Scala + Casbah + MongoDB project from GitHub.
If your database has a document whose symbol
field is AAPL
, when you run this object with sbt run
, the result will show the document that was deleted:
result: Some({ "_id" : { "$oid" : "5026b22c300478e85a145d43"}, "symbol" : "AAPL" , "price" : 600.0})
The following complete code shows how to delete multiple documents:
import com.mongodb.casbah.Imports._ object DeleteMultiple extends App { var collection = MongoFactory.collection // delete all documents with price > 200 collection.remove("price" $gt 200) }
In this case, the remove
method doesn’t return anything interesting, so I don’t assign it to a result.
See Also
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |