如何使用Casbah更新mongoDB中的嵌套数组对象

时间:2013-12-02 13:56:23

标签: mongodb scala lift casbah

我的MongoDB数据如下所示: -

      {
      "_id": 1,
      "categories":[
      {
      "categoryName": "Automobiles",
      "categoryId": 1,
      "catDisplayName": "language1",
      "subCategories": [
        {
            "subCategoryName": "cars",
            "subCategoryId": 1,
            "subCatDisplayName": "language2"
        },
        {
            "subCategoryName": "bykes",
            "subCategoryId": 2,
            "subCatDisplayName": "language3"
        }

    ]
},
{
    "categoryName": "Electronics",
    "categoryId": 2,
    "catDisplayName": "somelanguage1",
    "subCategories": [
        {
            "subCategoryName": "Mobiles",
            "subCategoryId": 1,
            "subCatDisplayName": "somelanguage2"
        },
        {
            "subCategoryName": "cameras",
            "subCategoryId": 2,
            "subCatDisplayName": "somelanguage3"
        }
       ]
      }
      ]
      }

我们正在尝试使用MongoDb Casbah的两个案例,以下案例是: -

  1. 如果存在catagory并且subCategory不存在则更新subCategories中的子类别Array

  2. 如果catagory不存在且subCategory不存在,则分别更新category和subCategories Array中的category和subCategory

  3. 我的案例1代码看起来像这样正常工作

    val builderObj = MongoDBObject.newBuilder
    builderObj += "subCategoryName" -> "cycles"
    builderObj += "subCategoryId" -> 3
    builderObj += "subCategoryName" -> "language4"
    builderObj.result ()
    
    val query = MongoDBObject("categories.categoryName" -> "Automobiles")
    
    val updatingdata = $addToSet("categories.$.subCategories" -> builderObj.result ())
    collection.update(query,updatingdata,true,true)
    

    但如何为案例2撰写我们正在尝试如下

    val builderObj1 = MongoDBObject.newBuilder
    builderObj1 += "categoryName"-> "Entertainment"
    builderObj1 += "categoryId"-> 3
    builderObj1 += "catDisplayName"-> "somelanguage4"
    
    val builderObj = MongoDBObject.newBuilder
    builderObj += "subCategoryName" -> "Tickets"
    builderObj += "subCatDisplayName"-> "language1"
    builderObj += "subCategoryId" -> 1
    builderObj.result ()
    
    val query = MongoDBObject("categories.$.categoryName" -> "Entertainment") //Entertainment  Category doesn't exist in my data
    
    val updatingdata = ? // How To Update the Cateroy and SubCategory at a time 
    collection.update()
    

    请给我建议我被击中

    最诚挚的问候 GSY

1 个答案:

答案 0 :(得分:1)

由于您要创建新类别,因此新类别的subCategories数组将为空。所以你可以直接将它添加到新类别中。

val subCatBuilder = MongoDBObject.newBuilder
subCatBuilder += "subCategoryName" -> "Tickets"
subCatBuilder += "subCatDisplayName"-> "language1"
subCatBuilder += "subCategoryId" -> 1
subCatBuilder

val catBuilder = MongoDBObject.newBuilder
catBuilder += "categoryName"-> "Entertainment"
catBuilder += "categoryId"-> 3
catBuilder += "catDisplayName"-> "somelanguage4"
catBuilder += "subCategories" -> MongoDBList(subCatBuilder.result())

val query = MongoDBObject() // How do you know which elements of collection to update?

val updatingdata = $push("categories" -> catBuilder.result())

collection.update(query, updatingdata, true, true)

当然,这将更新collection的每个元素以添加新类别。如果您想要更具选择性,则需要适当更新query