1. ホーム
  2. node.js

mongooseでObjectIdをデータ型として設定する方法

2023-09-19 05:50:59

質問

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" メソッドを作成することで、仮想プロパティを設定することができます。 このリンク をご覧ください。