MongoDB:在现有数组中添加一个数组

MongoDB: Adding an array into an existing array

本文关键字:数组 一个 添加 MongoDB      更新时间:2023-09-26

我正在尝试将"讲师"数组添加到现有的"营地"数组中。

层次结构看起来像这样:

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 : []
                }
            ]
};

我在MongoJS中使用Node Express,并且已经能够成功地添加所有者并添加"营地",然而,当我尝试将"讲师"添加到出现问题的特定营地时,在"addCoacher"功能中。我没有收到错误消息,相反,它只是在camps数组中的项目后面添加"Instructionrs"数组。

如有任何帮助,我们将不胜感激。以下是我的完整代码,包含可工作的函数,然后是不可工作的,下面是我的mongodb输出(尽管是错误的):

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);
                }
    });
};

输出

{ 
    "_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" } }
    ] 
}

您可能需要了解一下。您可以使用点旋转来实现这一点这是一种非常强大的方法,可以在更大的文档方案阵列中查找或更新项目。如果你仍然无法实现这一点,我很乐意为你提供以下代码。。。

我插入了一个新的所有者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);

给你,你添加了一个新文档现在,我要创建一个新的讲师对象来插入@newcreated owner2

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

以上是新讲师的文档对象您可以通过多种方式执行此更新,使用像这样的mongodb方法

collection.updatecollection.find和修改

如果您想插入或更新我们需要使用点旋转找到的子文档的任何值,并将子文档推送到文档中,这里的代码是

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

上面的代码在讲师字段下插入一个新记录,就像在字段中一个数组一样,它只是推送子文档

最终结果

{
"_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" : []
            }
        ]};