2013-12-16 4 views
4

Допустим, у меня есть эта структура:Как удалить объект внутри объекта с MongoDB (не внутри массива)

{ 
    "_id" : ObjectId("52af7c1497bcaf410e000002"), 
    "created_at" : ISODate("2013-12-16T22:17:56.219Z"), 
    "name" : "Hot", 
    "subcategories" : { 
     "Loco" : { 
      "subcategory" : "Loco", 
       "id" : "522423de-fffe-44be-ed3b-93fdd50fdb4f", 
       "products" : [ ] 
     }, 
     "Loco2" : { 
      "subcategory" : "Loco2", 
       "id" : "522423de-fffe-44be-ed3b-93fdd50fd55", 
       "products" : [ ] 
     }, 
    } 
} 

Как я могу удалить Loco2 изнутри подкатегорий оставив все остальное нетронутым?

Обратите внимание: мой объект селектор был ObjectId, так как будут другие документы, у которых есть структура, возможно, с тем же именем подкатегорий, которое относится к разным документам. Например, я мог бы также иметь другой объект, как это:

{ 
    "_id" : ObjectId("52af7c1497bcaf410e000003"), 
    "created_at" : ISODate("2013-12-16T22:17:56.219Z"), 
    "name" : "Medium", 
    "subcategories" : { 
     "Loco" : { 
      "subcategory" : "Loco", 
       "id" : "522423de-fffe-44be-ed3b-93fdd50332b4f", 
       "products" : [ ] 
     }, 
     "Loco2" : { 
      "subcategory" : "Loco2", 
       "id" : "522423de-fffe-44be-ed3b-93fdd522d55", 
       "products" : [ ] 
     }, 
    } 
} 

Так что мой запрос должен быть вдоль этих линий: db.categories.update({"_id": "ObjectId("52af7c1497bcaf410e000003")"}, {don't know this part yet})

EDIT: ответ сделал работу на раковине, когда я знаю имя подкатегории Я хочу удалить, но я не мог заставить его работать в моем узле приложения:

Categories.prototype.delSubcategory = function(categoryId, subcategory, callback) { 

    this.getCollection(function(error, category_collection) { 

     if(error) callback(error); 

     else { 

      category_collection.update(

       {_id: category_collection.db.bson_deserializer.ObjectID.createFromHexString(categoryId)}, 
       { $unset : { "subcategories.Loco2: "" } }, 
       function(error, subcategory) { 

        if(error) callback(error); 

        else callback(null, subcategory) 

       } 

      ) 

     } 

    }); 

}; 

ответ

4

Вы можете использовать $unset operator для удаления полей из документа или его подобъектов.

db.collection_name.update(
     {"_id": ObjectId("52af7c1497bcaf410e000003")}, 
     { $unset : { "subcategories.Loco2" : "" } } 
); 
+0

Я пробовал это, но он не работает. Когда я попытался использовать оболочку, я получил эту ошибку: SyntaxError: Неожиданный токен ILLEGAL – WagnerMatosUK

+0

В ответе @ Philipp есть синтаксическая ошибка, она должна читать '{" _id ": ObjectId (" 52af7c1497bcaf410e000003 ")}', т. Е. Никакие кавычки. Вы должны вызвать конструктор, который создает 'ObjectId' из' string'. – mnemosyn

+0

Yeap, я попробовал еще раз, и он действительно работал на оболочке. Один вопрос: как я могу заставить Loco2 в «subcategories.Loco2» как переменную в моем приложении Node? Я пробовал '' подкатегории '+ myVar: "" ', и это не сработало. Ни «подкатегории.myVar». Полный текст: – WagnerMatosUK

Смежные вопросы