#mongodb #node.js #mongoose
#mongodb #node.js #mongoose
Вопрос:
Я получаю объекты JSON через внешний API в node.js и хотите сохранить их в MongoDB. Я определил модель, подобную этой:
var Product = new Schema({
id: ObjectId,
name: String});
И теперь я пытаюсь сохранить объект:
JSONProduct = { id: 1234, name: 'The Foo Bar' };
product = new Product(JSONProduct);
product.save();
Объект нормально хранится в коллекции «products», но идентификатор из JSONProduct заменяется значением, созданным MongoDB:
{ "id" : ObjectId("119894980274616772006500"), "name" : "The Foo Bar" }
Основная причина, по которой я хочу использовать свой идентификатор продукта поверх созданного MongoDB, заключается в том, что я хочу предотвратить дублирование записей для продуктов. Я получаю объекты продукта JSON через запускаемый cronjob вызов внешнего API, включая уже существующие. Может быть, есть другой, лучший способ сделать это?
Ответ №1:
Вы определяете поле как ObjectId, но присваиваете ему номер. Чтобы создать идентификатор объекта, вам нужно сделать что-то вроде:
new ObjectId('something');
Однако в вашем случае это, вероятно, не лучшая идея. Определите свою модель следующим образом:
var Product = new Schema({
external_id: {type: Number, unique: true},
name: {type: String},
});
Вы можете указать unique
в поле, чтобы создать уникальный индекс для этого поля.
Ответ №2:
В вопросе, который вы упомянули,
Объект нормально хранится в коллекции «products», но идентификатор из JSONProduct заменяется созданным MongoDB значением: { «id»: ObjectId(«119894980274616772006500»), «name»: «Панель Foo» }
Но я думаю, что он создается как:
{ «_id»: ObjectId(«119894980274616772006500»), «name»: «Панель Foo» }
Кроме того, вы можете передать свой идентификатор продукта в поле с именем «_id», тогда mongo не будет создавать никаких отдельных идентификаторов, не будет принимать повторяющиеся значения и автоматически произведет индексацию для этого поля.
Но убедитесь, что вы добавляете уникальные значения идентификатора продукта в _id.