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

时间:2011-04-05 20:55:48

标签: mongodb node.js 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创建的值替换:

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

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

2 个答案:

答案 0 :(得分:5)

您正在将字段定义为ObjectID,但您要为其分配一个数字。要创建ObjectID,您需要执行以下操作:

new ObjectId('something');

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

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

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

答案 1 :(得分:0)

在你提到的问题中,

该对象在"产品中存储良好"集合,但来自JSONProduct的id被MongoDB创建的值替换: {" id" :ObjectId(" 119894980274616772006500")," name" :" Foo Bar" }

但我认为它创建为:

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

此外,您可以通过名称" _id"将您的商品ID传递到字段,然后mongo不会创建任何单独的ID,并且它不会接受重复的值并且它会有为该字段自动编制索引。

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