1

以下のようなユーザースキーマがあるとします。

var User = new db.Schema({
    username    : {type: String, unique: true}
    , password    : String
    , email: String
});

友達がいるユーザーに対応するために、次のようにスキーマを変更することを考えています。

var User = new db.Schema({
    username    : {type: String, unique: true}
    , password    : String
    , email: String
    , friends: [?]
});

ObjectIdを格納するだけでなく、クエリを高速化するためにデータベースを非正規化することを考えています。今のところ、ObjectIdとusernameをfriends配列に格納したいとします。のようなことをすることは可能ですか

friends: [{String, String}]

ここで、2つの文字列はObjectIdとユーザー名を表しますか?新しいObjectIdは必要ないので、まったく新しいスキーマを作成したくありません。

4

1 に答える 1

3

確かにこれを行うことはできますが、(Mongoシェル構文で)次のようにフィールドに名前を付けることをお勧めします。

user = {
    '_id' : ObjectId(....),
    'username' : 'derick',
    'password' : 'notmypw',
    'email' : 'nospam@example.com',
    'friends' : [
        { 'id': ObjectId(....), 'username' : 'adam' },
        { 'id': ObjectId(....), 'username' : 'ross' },
    ]
};

ただし、(もちろん)ObjectIdを保存する必要はありません。これは、usernameがすでに一意であるためです。_idちなみに、フィールドのIDとしてユーザーのユーザー名を作成することもできます。

user = {
    '_id' : 'derick',
    'password' : 'notmypw',
    'email' : 'nospam@example.com',
    'friends' : [
        { 'username' : 'adam' },
        { 'username' : 'ross' },
    ]
};

マングースでは、次のようにする必要があると思います(http://mongoosejs.com/docs/model-definition.htmlの「ドキュメント内のドキュメントの定義」を読んでください) 。

var Friend = new db.Schema({
    username  : String
});

var User = new db.Schema({
    username    : {type: String, unique: true}
    , password    : String
    , email: String
    , friends: [Friend]
});
于 2012-05-12T07:55:29.117 に答える