2013-06-25 119 views
9

我有一个文件“所有者”,可以有“n”个营地,营地有“导师”,导师有“班级”。之前我尝试用嵌套数组完成此操作(请参阅下面的链接),但是我了解到位置运算符“$”不能嵌套那么深。 MongoDB: Adding an array into an existing arrayMongoDb:如何将其他对象插入对象集合?

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

下面是我想达到的层次结构:

owner = { 

    firstName: 'john', 
    lastName: 'smith', 
    ownerEmail: '[email protected]', 

    camps : { 

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

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

     instructors : { 

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

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

    } 

} 

我也一直在努力执行以下操作:

db.owners.update({ownerEmail:'[email protected]'}, {$set: { camps:{ {name:'cubs-killeen'} } }}) 

但这会引发意想不到的标志{错误。

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

V/R

克里斯

+1

这些都不是有效的文件。你不能有像你试图做'营地'和'导师'一样的未命名的嵌套对象。 – JohnnyHK

+1

你是不是指'阵营:{名称:'cubs-killeen'}'而不是'阵营:{{name:'cubs-killeen'}}'? –

+0

@Relfor,是的,这就是我的意思!谢谢澄清。现在,如何实现该文档结构? – cpeele00

回答

18

至于其他提到的,你想要的结构是无效的。 我推荐以下结构的所有者文档:

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

然后

db.stack.update(
    { ownerEmail: "[email protected]" }, 
    { 
    $push: { 
     camps: { name: "cubs-killeen", location: "some other Place" } 
    } 
    } 
); 

到这一点,你可以添加阵营是这样的:

希望它能帮助。

+0

嗯,那么我会如何将一名教练与一个营地联系起来?然后和导师一起上课(因为不同的导师教授不同的课程)?这种方法似乎是从Mongo的Rich Document中受益。也许我应该只使用Mongoose并以关系的方式设计它。感谢您的回复:-) – cpeele00

+2

那么,一个阵营可以有几名教练?在这种情况下,只需在“阵营”的每个阵营内放置“教官”名单即可。你可以像下面这样使它成为一个字符串数组:''教师':[“Joe Black”,“Will Smith”,“Some Other”]'。如果你想存储关于教师的更多信息,只需创建一个新的集合“教师”,并将其名称作为ID。 '{“_id”:“乔黑”,“年龄”:21,“电话”:“123”}'。尝试考虑简单性以及在考虑关系关系之前如何查询数据。 NoSQL(NoRelational)很难在你的脑海中发现,但当你这样做的时候它会回报。 – AntonioOtero

相关问题