使用自定义的ObjectId并避免Mongoose中的重复条目

我通过node.js中的外部API获取JSON对象,并希望将它们存储在MongoDB中。 我定义了这样一个模型:

var Product = new Schema({ id: ObjectId, name: String}); 

现在我试图存储一个对象:

 JSONProduct = { id: 1234, name: 'The Foo Bar' }; product = new Product(JSONProduct); product.save(); 

该对象在“products”集合中保存得很好,但是来自JSONProduct的id被MongoDB创build的值replace:

 { "id" : ObjectId("119894980274616772006500"), "name" : "The Foo Bar" } 

为什么我想要使用我的产品ID在MongoDB创build一个主要的原因是,我想要防止产品的重复条目。 我通过外部API(包括已经存在的API)的cronjob触发调用来获取JSON Product对象。 也许有另外一个更好的方法来做到这一点?

您正在将字段定义为ObjectID,但您正在为其分配一个数字。 要创build一个ObjectID,你需要做如下的事情:

 new ObjectId('something'); 

但是,在你的情况下,这可能不是最好的主意。 像这样定义你的模型:

 var Product = new Schema({ external_id: {type: Number, unique: true}, name: {type: String}, }); 

您可以在字段上指定unique索引以为该字段创build唯一索引。

在你提到的问题中,

对象存储在“products”集合中,但是JSONProduct中的id被MongoDB创build的值replace:{“id”:ObjectId(“119894980274616772006500”),“name”:“The Foo Bar”}

但是我认为它被创build为:

{“_id”:ObjectId(“119894980274616772006500”),“name”:“The Foo Bar”}

另外,你可以通过名字“_id”将你的产品ID传递给字段,那么mongo不会创build任何单独的ID,它不会接受重复的值,并且会自动为该字段build立索引。

但请确保将产品ID的唯一值推送到_id。