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

2024-02-02

我正在尝试将“Instructors”数组添加到现有的“Camps”数组中。

层次结构看起来像这样:

owner = {

    email : '[email protected] /cdn-cgi/l/email-protection',
    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”函数中,当我尝试将“讲师”添加到特定营地时,就会出现问题。我没有收到错误消息,而是简单地将“Instructors”数组附加在camps 数组中的项目之后。

任何帮助将不胜感激。下面是我的完整代码,包含工作函数,然后是不工作的代码,下面是我的 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);
                }

    });

};

OUTPUT

{ 
    "_id" : ObjectId("51c7b04d2746ef6078000001"), 
    "email" : "[email protected] /cdn-cgi/l/email-protection", 
    "firstName" : john, 
    "lastName" : smith, 
    "password" : "mypassword", 
    "camps" : [  
                {   
                    "name" : "cubs-killeen",     
                    "location" : "killeen",     
                    "managerName" : "bill jones",     
                    "managerEmail" : "[email protected] /cdn-cgi/l/email-protection",  
                    "managerPassword" : "secretpasscode",    
                    "instructors" : [ ],    
                    "students" : [ ] 
                },     
                {   "instructors" : {   "name" : "jon tisdale" } }
    ] 
}

您可能需要看一下this http://docs.mongodb.org/manual/reference/glossary/#term-dot-notation。你可以使用 dot.notation 来实现这一点 这是在更大的文档方案数组中查找或更新项目的非常强大的方法。如果您仍然无法实现这一点,我很乐意为您提供以下代码......

我已插入新所有者2

owner2 = {

email : '[email protected] /cdn-cgi/l/email-protection',
password : 'mypassword',
firstName : 'murali',
lastName : 'ramakrishnan',

camps : [ 

            {

                name : 'Rotary club',
                location : 'trichy',
                manager : {name: 'baskaran', email: '[email protected] /cdn-cgi/l/email-protection', password: 'baskaran'},

                instructors : [

                    {

                        firstName : 'baskaran',
                        lastName : 'subbiah',

                        classes : []                        
                    }, 

                    {

                        firstName : 'david',
                        lastName : 'nover',

                        classes : [],

                    },

                ],

                students : []

            }
        ]};

如果您看到我们只需要根据要求添加一名新讲师...... 首先将文档添加到集合中

db.try.insert(owner2);

在这里,您已经添加了一个新文档 现在,我将创建一个新的讲师对象来插入@新创建的所有者2

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

以上是新讲师的文档对象 您可以通过多种方式执行此更新,使用 mongodbs 方法,例如

集合.更新 集合.findAndModify

如果要向子文档插入或更新任何值,我们需要使用点符号查找并将子文档推送到文档,这里是代码

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

上面的代码在讲师字段下插入一条新记录,因为该字段是一个数组,它只是推送子文档

最终结果

{
"_id" : ObjectId("51c7b222c0468dc711a60916"), 
"email" : "[email protected] /cdn-cgi/l/email-protection",
"password" : "mypassword",
"firstName" : "murali",
"lastName" : "ramakrishnan",

"camps" : [ 

            {

                "name" : "Rotary club",
                "location" : "trichy",
                "manager" : {"name": "baskaran", "email": "[email protected] /cdn-cgi/l/email-protection", "password": "baskaran"},

                "instructors" : [

                    {

                        "firstName" : "baskaran",
                        "lastName" : "subbiah",

                        "classes" : []                        
                    }, 

                    {

                        "firstName" : "david",
                        "lastName" : "nover",

                        "classes" : [],

                    },
        {

                        "firstName" : "lakshmi",
                        "lastName" : "kanthan",

                        "classes" : [],

                    }

                ],

                "students" : []

            }
        ]};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB:将数组添加到现有数组中 的相关文章

随机推荐

  • 我可以将自定义属性传递给 NLOG 并输出到文件吗?

    编辑 4 From 似乎是 NLog 中的保留字 更改它 FromID 有效 这是一种将变量传递给 NLog 并保持代码干净的好方法 谢谢迈克 编辑3 我真的很喜欢这个主意 按照迈克的建议实现了一个辅助类 public class NLog
  • PHP 电子邮件转垃圾邮件

    我正在尝试向新注册用户发送电子邮件以进行电子邮件验证 PHP 但我不明白 为什么电子邮件会被发送到垃圾邮件 我已经检查了类似的问题 所有答案都是关于标头的 对我来说了解这些标头以及它们是如何验证的似乎有点复杂 通过发件人网站 可以说我发送为
  • 如何在Android 2.0上读取联系人

    我正在开发 Android 2 0 并试图接收所有联系人的列表 Since android provider Contacts People已弃用 我必须使用android provider ContactsContract 但我找不到如何
  • PHP preg_replace 函数替换以前的匹配项

    我有一个相当基本的情况 我有一个字符串数组 我想在单个字符串中找到这些字符串的所有匹配项 并在它们周围放置强标签 这是我到目前为止所拥有的 searchWords array test this s for i 0 i
  • Bootstrap 4:对齐卡片组内的内容

    我的 Bootstrap 4 页面中有一副纸牌 我想对齐这些按钮以获得更好的外观 我们怎样才能做到这一点 Here is an image 这是演示 http 7freres com new http 7freres com new 这张桌
  • 在笔尖而不是故事板中制作单元原型

    为了更好的可重用性 我想在故事板之外创建一个表格视图 现在当我创建一个UITableViewXcode 中基于 ViewController 和 Nib 我在 nib 文件中获得默认的 TableView 但是 我无法在 Interface
  • 在 find -execdir 中从文件名中去除 ./

    整个故事 我正在编写一个脚本 将所有文件从一个目录链接到另一个目录 新文件名将包含原始目录名 我用find此时此刻与 execdir选项 这就是我想使用它的方式 linkPictures sh 2017 wien 2017 10 它将创建一
  • 如何在 NUnit 2.5 中使用 TestCase?

    我有一个Currency我使用 NHibernate 将其保存到数据库中 Currency类看起来像这样 public class Currency Entity public virtual string Code get set pub
  • 如何在调用strcpy之前分配数组?

    Given char test bla bla bla 两者哪个更正确 char test1 malloc strlen test strcpy test1 test or char test1 malloc sizeof test str
  • 一个具有不同返回类型的函数......可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public string FetchValueAsString string key public int FetchValueAsInteger string key public bool Fet
  • npm run 脚本中参数的 if-else

    我想调用不同的其他脚本 具体取决于是否给出参数 paramtest if z 1 then echo Foo 1 else echo Bar fi npm 运行参数测试 应该给 酒吧 npm run paramtest 无论如何 应该给出
  • 以编程方式从 Yahoo! 获取联系人地址簿[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何开始使用 MS-Build

    我希望开始使用 MS Build 到目前为止 我有很多手动构建的项目 从 Visual Studio 我想自动化构建过程 并且最好是在我不想安装 Visual Studio 的机器上进行 我开始在 MSDN 上阅读有关 MS Build 的
  • Actor 系统无响应:ThreadPoolExecutor 调度程序仅创建核心线程池,显然忽略最大线程池大小

    更新 我发现如果我设置ThreadPoolExecutor s核心池大小与最大池大小相同 29 个线程 但是 如果我将核心池大小设置为 11 最大池大小设置为 29 那么 Actor 系统只会创建 11 个线程 我该如何配置ActorSys
  • Laravel 服务提供商不受合同约束

    我有以下由服务提供商绑定的合同 接口 但是我收到以下错误 RouteDependencyResolverTrait php 第 81 行中的 ReflectionException 类 App Http Controllers Rocket
  • MongoDB/Mongoose 索引使查询更快还是更慢?

    我有一个这样的文章模型 var ArticleSchema new Schema type String title String content String hashtags String comments type Schema Ob
  • 无法推断概念中的占位符类型

    我正在尝试使用 GCC 8 中的 Concepts TS 复制标准 C 20 概念 以便我可以在标准库中提供它们之前使用它们 我主要复制粘贴最新草稿中的所有内容 然后遇到一个问题 include
  • 将 facebook sdk 链接到 android 项目

    在 Eclipse 中创建 Android 项目并导入 facebook sdk 后 我转到 Android 应用程序的属性 选择 android 并添加 facebook sdk 然后单击 确定 然后 当我再次进入属性时 它会针对该 fa
  • 如何在Python中读取XML头

    如何在 Python 3 中读取 XML 文档的标头 理想情况下 我会使用 defusedxml 模块作为文件指出它更安全 https docs python org 3 library xml html 但在这一点上 经过几个小时的尝试弄
  • MongoDB:将数组添加到现有数组中

    我正在尝试将 Instructors 数组添加到现有的 Camps 数组中 层次结构看起来像这样 owner email email protected cdn cgi l email protection password mypassw