Node.js、mongoHQのmongodbおよびmongooseを使用します。カテゴリのスキーマを設定しています。文書ObjectIdをcategoryIdとして使用したいと思います。
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();
});
CategoryIdの値を提供していないことに注意してください。 mongooseはスキーマを使用して生成しますが、ドキュメントには通常の「_id」があり、「categoryId」はありません。何が間違っていますか?
従来のRBDMとは異なり、mongoDBではランダムフィールドを主キーとして定義することはできません。_idフィールドはすべての標準ドキュメントに存在する必要があります。
このため、別のuuidフィールドを作成することは意味がありません。
Mongooseでは、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
});
ご覧のとおり、categoryIdに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を呼び出すたびに、mongooseは_idを返すだけです。
仮想プロパティを設定できるように「set」メソッドを作成することもできます。詳細については、 this link をご覧ください
質問のタイトルに別の答えを探していたので、他の人もそうでしょう。
タイプをObjectIdとして設定するには(たとえば、author
の作成者としてbook
を参照できます)、次のようにできます。
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
}
});
ObjectIdの使用に関する私のソリューション
// 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)
Mongooseの 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
})
@dexが提供するソリューションは私のために働きました。しかし、私のために働いた何か他のものを追加したい:使用
let UserSchema = new Schema({
username: {
type: String
},
events: [{
type: ObjectId,
ref: 'Event' // Reference to some EventSchema
}]
})
作成するものが配列参照である場合。しかし、あなたが欲しいものがオブジェクト参照である場合、それはあなたがとにかく探しているかもしれないと思うものです、次のようにvalue propから括弧を削除します:
let UserSchema = new Schema({
username: {
type: String
},
events: {
type: ObjectId,
ref: 'Event' // Reference to some EventSchema
}
})
2つのスニペットをよく見てください。 2番目のケースでは、キーイベントの値propにはオブジェクトdefを囲む括弧がありません。