RecipeVersionCollection.scala 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package com.weEat.migrations
  2. import org.mongodb.scala.MongoDatabase
  3. import com.mongodb.client.model._
  4. import org.mongodb.scala.model.Filters._
  5. import org.mongodb.scala.model.Field
  6. import org.mongodb.scala.bson.{BsonArray,BsonDocument}
  7. import com.weEat.shared.models.{FoodNodeId,RecipeNodeId}
  8. import com.weEat.models.{FoodNodeView,FoodNode,RecipeVersion}
  9. import scala.concurrent.ExecutionContext
  10. object RecipeVersionCollection extends Migration {
  11. implicit val ec: ExecutionContext = ExecutionContext.global
  12. private def typ = `type` _
  13. def execute(db: MongoDatabase) = createRecipeVersionCollection(db)
  14. .flatMap((_) => createFoodView(db))
  15. def createRecipeVersionCollection(db: MongoDatabase) =
  16. db.createCollection(RecipeVersion.collectionName).head().flatMap({ (_) =>
  17. val foods = db.getCollection[RecipeNodeId](FoodNode.collectionName)
  18. foods.aggregate(Seq(
  19. Aggregates.`match`(equal("_t", "RecipeNodeId")),
  20. Aggregates.addFields(Field("vid", "$_id")),
  21. Aggregates.out(RecipeVersion.collectionName)
  22. )).head().flatMap({ (_) =>
  23. val foods = db.getCollection[FoodNodeId](FoodNode.collectionName)
  24. foods.aggregate(Seq(
  25. Aggregates.`match`(equal("_t", "RecipeNodeId")),
  26. Aggregates.project(Projections.fields(
  27. Projections.include("_id", "uid", "name"),
  28. Projections.computed("headVid", "$_id"),
  29. Projections.computed("_t", "RecipeMetaNodeId")
  30. )),
  31. Aggregates.merge(FoodNode.collectionName)
  32. ))
  33. .head()
  34. })
  35. })
  36. def createFoodView(db: MongoDatabase) =
  37. db.createView(
  38. FoodNodeView.collectionName,
  39. FoodNode.collectionName,
  40. Seq(
  41. Aggregates.lookup(
  42. RecipeVersion.collectionName,
  43. "headVid",
  44. "_id",
  45. "recipe"
  46. ),
  47. Aggregates.addFields(Field("recipe._id", "$_id")),
  48. Aggregates.replaceRoot(
  49. BsonDocument(("$ifNull", BsonArray(
  50. BsonDocument(("$first", "$recipe")),
  51. "$$ROOT"
  52. )))
  53. ),
  54. Aggregates.project(Projections.exclude("recipe")),
  55. )
  56. ).head()
  57. }