2012-08-24 65 views
2

我创造了猫鼬像这样的结构的MongoDB的文档中的子对象_id:(用猫鼬)

var Access = new Schema({ 
    userId   : { type: ObjectId, unique: true }, 
    key   : { type: String, index: true }, 
    isOwner  : { type: Boolean, index: true }, 
}); 
mongoose.model('Access', Access); 
var Workspace = new Schema({ 
    name   : { type: String, lowercase: true, unique: true}, 
    activeFlag  : Boolean, 
    settings  : { 
    welcomeMessage : String, 
    invoiceTemplate : String, 
    longName  : String, 
    defaultCountry : String, 
    countryId  : { type: ObjectId, index: true }, 
    }, 
    access   : [ Access ], 

}); 
mongoose.model('Workspace', Workspace); 

添加一些文件后,我看到的结果是:

{ "activeFlag" : true, 
    "name" : "w7", 
    "_id" : ObjectId("5036131f22aa014c32000006"), 
    "access" : [ 
    { "user": "merc", 
     "key" : "673642387462834", 
     "isOwner" : true, 
     "_id" : ObjectId("5036131f22aa014c32000007") 
    } 
    ], 
    "__v" : 0 
} 

我对子文档中的_id感到困惑,如果我只将它作为子结构而不是子模式添加,似乎不会发生。 所以问题:

1) _id从哪里来? Mongoose的司机是否在做这件事?如果是这样,我怎样才能达到使用直Mongodb的相同行为?只需添加一个ObjectId字段?

2) 您何时使用子文档,以及何时只使用数据结构?

3) 我还没有开始使用我的web应用程序的严重部分。但是,如果您允许JsonRest访问文档中的子记录,那么是否会出现真的,我的意思是真的有用吗?

谢谢你一如既往!

Merc。

回答

2

编辑:根据下面的评论删除数据重复的答案片。

为了回答您的其他问题,如何在MongoDB中自我复制这一点,可以按如下方式创建一个文件:

db.foo.insert(
    { "activeFlag" : true, 
     "name" : "w7", 
     "access" : [ 
     { "userId" : ObjectId(), 
     "key" : "673642387462834", 
     "isOwner" : true, 
     "_id" : ObjectId() 
     } 
     ], 
    "__v" : 0 
}) 

讲解,根文档中的_id是隐含的 - 它将被添加如果没有指定MongoDB的话。但是,要将_id放入子文档中,您必须通过调用ObjectId()函数手动指定它。我的文档看起来像这样:

db.foo.find().pretty() 
{ 
    "_id" : ObjectId("50375bd0cee59c8561829edb"), 
    "activeFlag" : true, 
    "name" : "w7", 
    "access" : [ 
     { 
      "userId" : ObjectId("50375bd0cee59c8561829ed9"), 
      "key" : "673642387462834", 
      "isOwner" : true, 
      "_id" : ObjectId("50375bd0cee59c8561829eda") 
     } 
    ], 
    "__v" : 0 
} 
+0

对不起,我的坏...该userId实际上指向一个不同的表中的ID。所以实际上没有重复,猫鼬增加的_id很方便!也许用这个新信息更新答案 - 谢谢! – Merc

+0

我确实解释了它来自哪里以及如何在直接的MongoDB中生成它 - 您还在寻找哪些其他信息?何时使用子文档问题已被问及很多次(查找嵌入与链接相似)。 –

+0

答案很好,但是我的数据没有重复,所以也许会拿出一些关于重复的内容,这些内容不会成为核心问题的一部分。谢谢你的回答! – Merc