【问题标题】:MongoDb : How to insert additional object into object collection?MongoDb:如何将附加对象插入对象集合?
【发布时间】:2013-06-25 02:58:52
【问题描述】:

我有一个文档“所有者”,它可以有“n”个营地,营地有“讲师”,讲师有“课程”。早些时候,我尝试使用嵌套数组来完成此操作(请参阅下面我的帖子的链接),但是我了解到位置运算符“$”不会嵌套那么深。 MongoDB: Adding an array into an existing array

但是,我了解到解决方法是使用对象集合而不是数组。我假设我必须使用带有“$set”的“update”来添加额外的“camps”,但是每次我所做的一切都是覆盖(更新)之前插入的camp。

下面是我想要完成的层次结构:

owner = {

    firstName: 'john',
    lastName: 'smith',
    ownerEmail: 'john.smith@gmail.com',

    camps : {

        {
            name: 'cubs-killeen',
            location: 'killeen'
        },

        {
            name: 'cubs-temple',
            location: 'temple'
        },

        instructors : {

            {
                firstName: 'joe',
                lastName : 'black'
            },

            {
                firstName: 'will',
                lastName : 'smith'
            }        
        }

    }

}

我也一直在尝试以下方法:

db.owners.update({ownerEmail:'john.smith@gmail.com'}, {$set: { camps:{ {name:'cubs-killeen'} } }})

但这会引发意外的标识符 { 错误。

对于实现上述结构的一些示例 mongo 命令的任何帮助将不胜感激。

V/R

克里斯

【问题讨论】:

  • 那些不是有效的文件。您不能像尝试使用 campsinstructors 那样拥有未命名的嵌套对象。
  • 您的意思是camps: {name:'cubs-killeen'} 而不是camps:{ {name:'cubs-killeen'} }
  • @Relfor,是的,我就是这个意思!感谢您的澄清。现在,如何实现该文档结构?
  • MongoDB 或多或少是一个 javascript 对象存储。在 Javascript 中,列表(例如教师列表)使用 [] 括号而不是 {} 大括号。大括号 {} 包含存储键值对的对象。另外我认为课程应该是营地的另一个财产,而不是教练。您可以将时间表、位置和讲师作为课程的属性。
  • @Paul,感谢您的回复!我真正在寻找的是我必须使用什么 Mongodb 命令语法来实现这一点......或者我将如何使用 MongoJS 来做到这一点,或者。再次感谢!

标签: javascript node.js mongodb mongojs


【解决方案1】:

如前所述,您想要的结构无效。 我建议您的所有者文档采用以下结构:

    {
    "_id" : ObjectId("51c9cf2b206dfb73d666ae07"),
    "firstName" : "john",
    "lastName" : "smith",
    "ownerEmail" : "john.smith@gmail.com",
    "camps" : [
            {
                    "name" : "cubs-killeen",
                    "location" : "killeen"
            },
            {
                    "name" : "cubs-temple",
                    "location" : "temple"
            }
    ],
    "instructors" : [
            {
                    "firstName" : "joe",
                    "lastName" : "black"
            },
            {
                    "firstName" : "will",
                    "lastName" : "smith"
            }
    ]
}

然后

db.stack.update(
  { ownerEmail: "john.smith@gmail.com" },
  {
    $push: {
      camps: { name: "cubs-killeen", location: "some other Place" }
    }
  }
);

有了这个,你可以像这样添加营地:

希望对你有帮助。

【讨论】:

  • hmmm,那我如何将讲师与营地联系起来?然后和讲师一起上课(因为不同的讲师教不同的课程)?这种方法似乎从 Mongo 的富文档优势中汲取了一些方法。也许我应该只使用 Mongoose 并以相关的方式设计它。感谢您的回复:-)
  • 那么,一个营地可以有几个导师?在这种情况下,只需将“讲师”列表放在“营地”中的每个营地内。为简单起见,您可以将其设为字符串数组,如下所示:"instructors":["Joe Black","Will Smith","Some Other"]。如果您想存储有关讲师的更多信息,只需创建一个新集合“讲师”并将名称作为 ID。 {"_id":"Joe Black", "age":21, "phone":"123"}。在考虑考虑关系之前,尝试考虑简单性以及如何查询您的数据。 NoSQL (NoRelational) 很难在你的脑海中浮现,但当你这样做时,它就会得到回报。
【解决方案2】:
var newObject = {usuario: req.body.usuario, fecha: req.body.fecha, edit: 
req.body.edit};

await Documentos.findByIdAndUpdate(id,
 { deleted_doc: true,
 $push: { history: newObject } }); 
res.json({ status: 'Documentos Updated' });

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 2019-01-17
    • 1970-01-01
    • 2020-11-08
    • 2020-07-16
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多