Использование самоопределяемого идентификатора объекта и предотвращение двойных записей в Mongoose

#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.