2012-08-24 99 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