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

如何使用Casbah更新mongoDB中对象的嵌套数组,mongodb,scala,lift,casbah,Mongodb,Scala,Lift,Casbah,我的MongoDB数据如下所示:- { "_id": 1, "categories":[ { "categoryName": "Automobiles", "categoryId": 1, "catDisplayName": "language1", "subCategories": [ { "subCategoryName": "cars",

我的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代码看起来像这样,工作正常

    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

    由于您正在创建一个新类别,因此新类别的
    子类别
    数组将为空。因此,您可以直接将其添加到新类别中

    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)
    

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

    因为您正在创建一个新类别,新类别的
    子类别
    数组将为空。因此,您可以直接将其添加到新类别中

    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)
    

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

    Hi。。。。。Kong上面的代码工作正常,但我们想从电子产品类别中删除子类别(例如:-我想从mydata中删除手机)我们正在尝试的代码如下:-val removingData=$pull(MongoDBObject(“类别”->MongoDBObject(“CategorityName”->“娱乐”))此代码用于删除特定类别,但是如何从特定类别中删除一个或多个子类别。我不确定我是否完全理解您要执行的操作。也许你可以提交一个单独的问题,并进一步阐述你想做什么以及迄今为止你已经尝试了什么。嗨。。。。。Kong上面的代码工作正常,但我们想从电子产品类别中删除子类别(例如:-我想从mydata中删除手机)我们正在尝试的代码如下:-val removingData=$pull(MongoDBObject(“类别”->MongoDBObject(“CategorityName”->“娱乐”))此代码用于删除特定类别,但是如何从特定类别中删除一个或多个子类别。我不确定我是否完全理解您要执行的操作。也许你可以提交一个单独的问题,并进一步阐述你想做什么以及迄今为止你已经尝试了什么。