2011-11-13 15 views
44

mongoHQとmongooseでnode.js、mongodbを使用する。カテゴリのスキーマを設定しています。ドキュメントObjectIdをcategoryIdとして使用したいと思います。mongooseのデータ型としてObjectIdを設定する方法

var mongoose = require('mongoose'); 

var Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 
var Schema_Category = new Schema({ 
    categoryId : ObjectId, 
    title  : String, 
    sortIndex : String 
}); 

私はその後、私は区分コードの値を提供しない

var Category = mongoose.model('Schema_Category'); 
var category = new Category(); 
category.title = "Bicycles"; 
category.sortIndex = "3"; 

category.save(function(err) { 
    if (err) { throw err; } 
    console.log('saved'); 
    mongoose.disconnect();  
}); 

お知らせを実行します。私はmongooseがそれを生成するためにスキーマを使用すると仮定しましたが、ドキュメントには通常 "_id"があり、 "categoryId"はありません。私は間違って何をしていますか?

答えて

95

従来のRBDMと異なり、mongoDBでは、任意のフィールドをプライマリキーとして定義することはできません。すべての標準ドキュメントに対して_idフィールドが存在しなければなりません。

このため、別のuuidフィールドを作成することは意味がありません。

マングースでは、ObjectIdタイプは新しいuuidを作成するのではなく、他のドキュメントの参照に使用されます。ここで

は一例です:

var mongoose = require('mongoose'); 

var Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 
var Schema_Product = new Schema({ 
    categoryId : ObjectId, // a product references a category _id with type ObjectId 
    title  : String, 
    price  : Number 
}); 

あなたが見ることができるように、それがのObjectIdとの区分を移入するあまり意味がありません。

しかし、うっとりしたuuidフィールドが必要な場合、mongooseはフィールドをプロキシ(参照)できる仮想プロパティを提供します。

それをチェックアウト:

var mongoose = require('mongoose'); 

var Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 
var Schema_Category = new Schema({ 
    title  : String, 
    sortIndex : String 
}); 

Schema_Category.virtual('categoryId').get(function() { 
    return this._id; 
}); 

はだから今、あなたはcategory.categoryIdを呼び出すたび、マングースは、だけではなく、_idを返します。

仮想プロパティを設定できるように、また、私はので、多分他の人がなり、質問のタイトルのために異なる答えを探していたより多くの情報

+0

完璧な回答! ありがとう! – idophir

+0

仮想プロパティを設定した後、私は試しました: db.cats.find({categoryId:ObjectId( "id")}))がnullの結果を得ました。 私はdb.cats.findを使用します({_ id:ObjectId( "id")})私はdocを取得しました。したがって、仮想プロパティを検索に使用できないように見えます。 すべてのIDに_idを使用するのではなく、明確な名前を使用して各IDを参照できる場合は、コードを管理する方が簡単だと思います。ちょっと考えて... – idophir

12

ためthis link をチェックアウトし、「設定」メソッドを作成することができますあまりにも。 ObjectId(あなたがたとえば、bookの著者としてauthorを参照する場合があります)とタイプを設定するには

、あなたは次のように行うことがあります。

const Book = mongoose.model('Book', { 
    author: { 
    type: mongoose.Schema.Types.ObjectId, // here you set the author ID 
              // from the Author colection, 
              // so you can reference it 
    required: true 
    }, 
    title: { 
    type: String, 
    required: true 
    } 
}); 
+0

ありがとう – Maverick

0

// usermodel.js 

const mongoose = require('mongoose') 
const Schema = mongoose.Schema 
const ObjectId = Schema.Types.ObjectId 


let UserSchema = new Schema({ 
    username: { 
    type: String 
    }, 
    events: [{ 
    type: ObjectId, 
    ref: 'Event' // Reference to some EventSchema 
    }] 
}) 

UserSchema.set('autoIndex', true) 

module.exports = mongoose.model('User', UserSchema) 

をObjectIdが使用上の私のソリューションマングースのpopulateメソッドの使用

// controller.js 

const mongoose = require('mongoose') 
const User = require('./usermodel.js') 

let query = User.findOne({ name: "Person" }) 

query.exec((err, user) => { 
    if (err) { 
    console.log(err) 
    } 

    user.events = events 
    // user.events is now an array of events 
}) 
0

@dexによって提供されたソリューションが私のために働いていました。しかし私は私のために働いた他のものを追加したい:あなたが作成したいものが配列リファレンスである場合は、

let UserSchema = new Schema({ 
    username: { 
    type: String 
    }, 
    events: [{ 
    type: ObjectId, 
    ref: 'Event' // Reference to some EventSchema 
    }] 
}) 

を使用してください。何がしたいことは、私はあなたがとにかく探しているかもしれないと思うものですオブジェクト参照の場合でも、このように、小道具からブラケットを取り外し:

let UserSchema = new Schema({ 
    username: { 
    type: String 
    }, 
    events: { 
    type: ObjectId, 
    ref: 'Event' // Reference to some EventSchema 
    } 
}) 

も2つのスニペットを見てください。 2番目のケースでは、キーイベントの値propにオブジェクトdefの角括弧はありません。

関連する問題