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" メソッドを作成することで、仮想プロパティを設定することができます。 このリンク をご覧ください。
関連
-
[解決済み】Nodejs: Errorを解決する方法。ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み】「安全なTLS接続が確立される前にクライアントのネットワークソケットが切断されました」(ノード10
-
[解決済み】ブロックスコープの宣言は、ストリクトモード以外ではまだサポートされていません。
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み] TypeErrorです。リクエストパスにエスケープされていない文字が含まれています。
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] package.jsonの各依存関係を最新バージョンに更新する方法は?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】mongoError: トポロジーが破壊されました
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】「npm install」と「npm rebuild」の違いとは?
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] バルク更新を行う。