2015-11-16 83 views
2

鑑於從集合命名用戶以下模式:蒙戈如何更新文檔

{ 
    "email": "[email protected]", 
    "classes": [ 
     { 
      "className": "AAAA1111", 
      "marks": [72, 85, 64], 
      "grades": [20, 40, 30] 
     }, 
     { 
      "className": "BBBB2222", 
      "marks": [12, 25, 43], 
      "grades": [32, 42, 32] 
     } 
    ] 
} 

如何將我的另一個類添加到人與[email protected]?

例如電子郵件,我該怎麼辦添加子文檔

{ 
    "className": "CCCC3333", 
    "marks": [75, 85, 95], 
    "grades": [20, 30, 50] 
} 

同時保留現有信息?我如何刪除類AAAA1111而不影響文檔的其餘部分?我對mongo很陌生,並且遇到了我嘗試過的解決方案。最佳做法是什麼?

+0

請給我們模式模型。 –

+1

「用戶」是集合名稱,還是文檔中的關鍵字? –

+0

@RashadIbrahimov我的歉意,它是集合名稱。 – errorreplicating

回答

1

操作新類添加到陣列:

db.users.update({"email": "[email protected]"}, { 
    $push: { 
     "classes": { 
      "className": "CCCC3333", 
      "marks": [75, 85, 95], 
      "grades": [20, 30, 50] 
     } 
    } 
}); 

從陣列中刪除特定類的操作:

db.users.update({"email": "[email protected]"}, { 
    $pull: { 
     "classes": { 
      "className": "AAAA1111" 
     } 
    } 
}); 
0

添加classclasses可以檢索文件,新的類陣列推向classes和保存文檔:

users.findOne({ 
    email: '[email protected]' 
}).exec(function(err, user) { 
    var newClass = { 
     className: 'CCCC3333', 
     marks: [75, 85, 95], 
     grades: [20, 30, 50] 
    }; 

    user.classes.push(newClass); 
    user.save(function(err) { 
     if(err) console.log(err); 
     console.log('Updated!'); 
    }); 
}); 
1

要添加其它另一個階級的人與[email protected]電子郵件,使用positional $操作您的更新文件中,因爲此標識數組中的元素進行更新而不顯式指定的元素的位置陣列。在更新嵌入式文檔中的字段時,您需要使用點符號。使用dot notation時,請將整個虛線字段名稱用引號引起來。以下內容更新users文檔中的classes陣列。

定義一個updateClasses功能如下:

var updateClasses = function(db, callback) { 
    db.collection('classes').updateOne(
     { "users.email" : "[email protected]" }, 
     { 
      "$push": { 
       "users.$.classes": { 
        "className": "CCCC3333", 
        "marks": [75, 85, 95], 
        "grades": [20, 30, 50] 
       } 
      } 
     }, function(err, results) { 
     console.log(results); 
     callback(); 
    }); 
}; 

調用updateClasses功能。

MongoClient.connect(url, function(err, db) { 
    // handle error 
    if (err) handleError(err); 

    updateClasses(db, function() { 
     db.close(); 
    }); 
}); 

刪除"AAAA1111"類不影響文檔的其餘部分,使用德$pull運算符,它從一個現有的陣列中刪除匹配指定條件的值或值的所有實例:

db.collection('classes').updateOne(
    { "users.email" : "[email protected]" }, 
    { 
     "$push": { 
      "users.$.classes": { 
       "className": "AAAA1111" 
      } 
     } 
    }, function(err, results) { 
    console.log(results); 
    callback(); 
});