2

私はマングースでこのような構造を作成しています:

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から来るのですか?マングースの運転手はそれをやっていますか?もしそうなら、どうすればストレートMongodbを使用して同じ動作に到達できますか?ObjectIdフィールドを追加するだけですか?

2)いつサブドキュメントを使用し、いつデータ構造のみを使用しますか?

3)Webアプリケーションの重要な部分をまだ始めていません。ただし、そのIDは実際には存在しないのでしょうか。たとえば、JsonRestにドキュメント内のサブレコードへのアクセスを許可する場合に非常に役立ちますか

いつもありがとう!

メルク。

4

1 に答える 1

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
}
于 2012-08-24T10:51:04.063 に答える