web-dev-qa-db-ja.com

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

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」はありません。何が間違っていますか?

51
idophir

従来の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 をご覧ください

101
addisonj

質問のタイトルに別の答えを探していたので、他の人もそうでしょう。

タイプを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
  }
});
22
jpenna

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
})
2
dbx

@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を囲む括弧がありません。

0