2015-07-12 8 views
0

Я пытаюсь ссылаться на одну модель в другую с Mongoose делает это:MongoDB ссылка используя Mongoose

// продукт модель

var productSchema = new mongoose.Schema({ 

    id: {type: Number, unique: true, required: 'product_id'}, 
    sku: {type: String, unique: true, required: 'product_sku'}, 
    name: {type: String, required: 'product_name'}, 
    short_description: {type: String}, 
    details: [{ 
     type: String 
    }], 
    categories: [{ 
     type: String 
    }, {min: 1, max: 5}], 

}); 

module.exports = mongoose.model('products', productSchema); 

// модель заказа

var orderSchema = new mongoose.Schema({ 

    id: {type: String, unique: true}, 
    date: {type: Date, default: Date.now}, 
    products_sold: {type: mongoose.Schema.Types.ObjectId, ref: 'products'}, 

}); 

module.exports = mongoose.model('orders', orderSchema); 

Я ve уже создал продукт с идентификатором: 1:

"_id": ObjectId('55a1ce54b058d142051ca61d'), 
"id": 1, 
"sku": "p0001", 
"name": "test1", 
"short_description": "test", 
//etc 

Если я:

var newOrder = new Order({ 
     id: 'order001', 
     products_sold: 1, 
     //etc 
    }); 

    newOrder.save(function(err, data) { 
     if(err){ 
     console.log(err); 
     }else{ 
     console.log(data); 
     } 
    }); 

Он с ошибкой:

message: 'orders validation failed', 
    name: 'ValidationError', 
    errors: 
    { products_sold: 
     { [CastError: Cast to ObjectID failed for value "1" at path "products_sold"] 

Как я products_sold в моем заказе заполнен данными продукта, который имеет идентификатор 1?

Заранее спасибо

ответ

1

Вы определяете, что products_sold поле типа ObjectId, но вы пытаетесь установить Number в качестве значения. Чтобы хранить ссылки на документы в других коллекциях, вы должны сохранить _id ссылочного документа, а не произвольное поле идентификатора, которое вы имеете в Схеме. Вам нужно либо изменить тип для _id в базе данных своих продуктов, чтобы использовать целые числа (а затем вручную указать, что это значение поля _id при создании нового продукта), или вам нужно сохранить значение _id продукта в поле product_sold документа заказа ,

Ответ на комментарий:

Здесь обновляется код для определения собственного уникального _id поле:

Модель продукта

var productSchema = new mongoose.Schema({ 

    _id: {type: Number, unique: true, required: 'product_id'}, 
    sku: {type: String, unique: true, required: 'product_sku'}, 
    name: {type: String, required: 'product_name'}, 
    short_description: {type: String}, 
    details: [String], 
    categories: [{ 
     type: String 
     min: 1, 
     max: 5 
    }], 

}, {_id: false}); 

module.exports = mongoose.model('products', productSchema); 

В productSchema, вы увидите, что есть _id указан, и он установлен в required и не имеет значения default. Это должно сделать так, чтобы Монго использовал то, что вы указываете Number, так как это _id.

+0

Я понимаю, но я не знаю, как его реализовать, не могли бы вы привести мне пример? – mdv

+0

@mdv Вам ** нужно ** отдельное поле 'id' для продукта, или вы просто указываете произвольный' id' для каждого продукта? Я дам вам ответ о том, как это сделать, но зависит от того, нужно ли вам это дополнительное поле 'id', или, если это просто произвольное число, нормально ли вам использовать уникальное поле' _id', созданное Mongo ? –

+0

Я использую поле «id», потому что не хватает знаний о монго-моделях, если я использую поле _id, я не могу вручную указать идентификатор для продуктов, какой из них лучше? как я могу получить данные, если я не знаю поле _id. Спасибо Matthew – mdv

0

Вам необходимо передать objectId продукта в product_sold, а не в номер.

+0

Можно ли это сделать с моим id, а не _id? не могли бы вы привести мне пример? – mdv

Смежные вопросы