MongoDB:将数组添加到现有的数组中

我试图添加一个“讲师”数组到一个已经存在的“阵营”arrays。

分层结构看起来像这样:

owner = { email : 'john.smith@gmail.com', password : 'mypassword', firstName : 'john', lastName : 'smith', camps : [ { name : 'cubs-killeen', location : 'killeen', manager : {name: 'joe black', email: '', password: ''}, instructors : [ { firstName : 'bill', lastName : 'jones', classes : [] }, { firstName : 'jill', lastName : 'jones', classes : [], }, ], students : [] } ] }; 

我正在使用Node Express和MongoJS,并且已经能够成功添加一个所有者并添加“阵营”,然而,在“addInstructor”function中,当我尝试将“教师”添加到特定阵营时,即出现问题时。 我没有得到任何错误消息,而只是在“阵营”arrays中的项目之后追加“教师”arrays。

任何帮助将不胜感激。 下面是我的完整代码,工作函数,然后是不工作的,下面是我的mongodb输出(尽pipe是错误的):

 CampRepository = function(){}; CampRepository.prototype.addOwner = function(owner, callback){ console.log(db); db.owners.save(owner, function(err, saved){ if (err || !saved) { console.log('broke trying to add owner : ' + err); callback(err); } else { console.log('save was successful'); callback(null, saved); } }); }; CampRepository.prototype.addCamp = function(ownerEmail, camp, callback){ db.owners.update( {email: ownerEmail}, {$push: { camps:{ name: camp.name, location: camp.location, managerName: camp.managerName, managerEmail: camp.managerEmail, managerPassword: camp.managerPassword, managerPayRate: camp.managerPayRate, instructors: [], students: [] } } }, function(err, saved){ if (err || !saved) { console.log('broke trying to add camp ' + err); callback(err); } else { console.log('save was successful'); callback(null, saved); } }); }; /* THIS IS THE ONE THAT DOESN'T WORK */ CampRepository.prototype.addInstructor = function(ownerEmail, campName, instructor, callback){ db.owners.update( {email: ownerEmail, 'camps.name': campName}, {$push: { camps:{ instructors: { firstName: instructor.firstName, lastName: instructor.lastName, email: instructor.email }, } } }, function(err, saved){ if (err || !saved) { console.log('broke trying to add camp ' + err); callback(err); } else { console.log('save was successful'); callback(null, saved); } }); }; 

OUTPUT

 { "_id" : ObjectId("51c7b04d2746ef6078000001"), "email" : "john.smith@gmail.com", "firstName" : john, "lastName" : smith, "password" : "mypassword", "camps" : [ { "name" : "cubs-killeen", "location" : "killeen", "managerName" : "bill jones", "managerEmail" : "bill@gmail.com", "managerPassword" : "secretpasscode", "instructors" : [ ], "students" : [ ] }, { "instructors" : { "name" : "jon tisdale" } } ] } 

你可能需要看看这个 。 你可以使用dot.notation来实现这一点。这是非常强大的方法来查找或更新更大的文档scheme中的项目。 如果你仍然无法实现这一点,我会很乐意为您提供以下代码…

我插入了一个新的所有者2

 owner2 = { email : 'murali.ramakrishnan@gmail.com', password : 'mypassword', firstName : 'murali', lastName : 'ramakrishnan', camps : [ { name : 'Rotary club', location : 'trichy', manager : {name: 'baskaran', email: 'baskaran@mit.edu', password: 'baskaran'}, instructors : [ { firstName : 'baskaran', lastName : 'subbiah', classes : [] }, { firstName : 'david', lastName : 'nover', classes : [], }, ], students : [] } ]}; 

如果你看到我们只需要添加一个新的教师按要求…让我们先把文档添加到集合

 db.try.insert(owner2); 

在这里你去了现在你已经添加了一个新的文件,我要创build一个新的教师对象来插入@newly created owner2

 instructor1 = { firstName : 'lakshmi', lastName : 'kanthan', classes : [] }; 

上面是新教师的文档对象,你可以用很多方法执行这个更新,使用类似的mongodbs方法

collection.update collection.findAndModify

如果你想插入或更新子文档的任何值,我们需要使用dot.notationfind并将子文档推送到文档,这里的代码

 db.try.update( {'camps.name': "Rotary club" }, { $push: { 'camps.$.instructors' : instructor1 } } ) 

上面的代码在教师领域插入一个新的logging,就像在一个数组中,它只是推动子文档

最终结果

 { "_id" : ObjectId("51c7b222c0468dc711a60916"), "email" : "murali.ramakrishnan@gmail.com", "password" : "mypassword", "firstName" : "murali", "lastName" : "ramakrishnan", "camps" : [ { "name" : "Rotary club", "location" : "trichy", "manager" : {"name": "baskaran", "email": "baskaran@mit.edu", "password": "baskaran"}, "instructors" : [ { "firstName" : "baskaran", "lastName" : "subbiah", "classes" : [] }, { "firstName" : "david", "lastName" : "nover", "classes" : [], }, { "firstName" : "lakshmi", "lastName" : "kanthan", "classes" : [], } ], "students" : [] } ]};