2017-01-13 13 views
1

私の配列内に存在する各オブジェクトのObjectIDを生成します。Mongoose - 文書を保存する前にオブジェクトごとにObjectIDを生成

const productsSchema = new mongoose.Schema({ 

    apiKey: String, 
    domain: String, 
    totalcount: Number, 
    totaldone: Number, 
    allSKUS: Array, 
    allProducts: Array, 
    created_at: { type: Date }, 
    updated_at: { type: Date }, 

}, { collection: 'products', timestamps: true }); 

productsSchema.plugin(uniqueValidator); 

const Products = mongoose.model('Products', productsSchema); 

module.exports = Products; 

マイコード:事は、私は....

製品のスキーマを別のサーバーから.forEach文で製品を取得し、オブジェクトIDを生成し、スキーマなしで私の配列の内側にそれらをプッシュしていています:

const newProduct = { 

    apiKey: userApiProducts.apiKey, 
    domain: userApiProducts.domain, 
    totalcount: userApiProducts.totalcount, 
    totaldone: userApiProducts.totaldone, 
    allSKUS: userApiProducts.allSKUS, 
    allProducts: userApiProducts.allProducts // generate ObjectID for each object that gets pushed inside the Array 
}; 

Products.findOneAndUpdate(userApiProducts.domain, newProduct, {upsert:true} , (err, existingProducts) => { 
    if (err) { return next(err); } 
}); 

出力:

// Please Check ADD OBJECT ID HERE comment. This is where i want to generate an unique ObjectID before I push the data. I tried with var id = mongoose.Types.ObjectId(); but i'm afraid it will not be Unique... 

{ 
     "_id" : ObjectId("58780a2c8d94cf6a32cd7530"), 
     "domain" : "http://example.com", 
     "updatedAt" : ISODate("2017-01-12T23:27:15.465Z"), 
     "apiKey" : "nf4fh3attn5ygkq1t", 
     "totalcount" : 11, 
     "totaldone" : 11, 
     "allSKUS" : [ 
       "Primul", 
       "Al doilea", 
       "Al treilea" 
     ], 
     "allProducts" : [ 
      { 
       // ADD OBJECT ID HERE 
       "id": 1, 
       "sku": "Primul", 
       "name": "Primul", 
       "status": 1, 
       "total_images": 2, 
       "media_gallery_entries": [ 
        { 
         "id": 1, 
         "media_type": "image", 
         "label": null, 
         "position": 1, 
         "disabled": false, 
         "types": [ 
          "image", 
          "small_image", 
          "thumbnail", 
          "swatch_image" 
         ], 
         "file": "/g/r/grafolio_angel_and_devil.png" 
        }, 
        { 
         "id": 2, 
         "media_type": "image", 
         "label": null, 
         "position": 2, 
         "disabled": false, 
         "types": [], 
         "file": "/g/r/grafolio_angel_and_devil_thumbnail.jpg" 
        } 
       ] 
      }, 
      { 
       // ADD OBJECT ID HERE 
       "id": 3, 
       "sku": "Al doilea", 
       "name": "Al doilea", 
       "status": 1, 
       "total_images": 2, 
       "media_gallery_entries": [ 
        { 
         "id": 4, 
         "media_type": "image", 
         "label": null, 
         "position": 2, 
         "disabled": false, 
         "types": [], 
         "file": "/g/r/grafolio_angel_and_devil_thumbnail_1.jpg" 
        }, 
        { 
         "id": 5, 
         "media_type": "image", 
         "label": null, 
         "position": 3, 
         "disabled": false, 
         "types": [], 
         "file": "/b/e/before.png" 
        } 
       ] 
      }, etc ...... 
     ], 
     "__v" : 0, 
     "createdAt" : ISODate("2017-01-12T22:58:52.524Z") 
} 

はこれを行う方法はありますwithou DBコールのトンを作る必要はありませんか?私はすでに似た何かに働いており、このために完璧なソリューションを見つけたこの

array.forEach((x)=> { 
    Products.save({}) 
}) 

ホープ誰かのように節約を想像することはできません!あなたがdb.collection.insert()を使用することができますモンゴに複数のドキュメントを追加するには

答えて

1

ObjectIdを自動的に追加する場合は、別のスキーマを定義し、スキーマのオプションとして_idをtrueに設定する必要があります。

は、次の操作を行います

    はあなた productsSchema CatalogueSchemaとして( 理解を容易にするために)変更し
  • 新しいProductSchema製品用(allProductsの要素)CatalogueSchemaにおいて
  • [Product.schema]としてallProductsタイプを定義を定義します。これにより自動的に_idObjectId)が追加されます。

また、あなたは真として、タイムスタンプオプションを設定すると、スキーマの一部としてcreated_atupdated_atを追加する必要はありません。

カタログ・スキーマ

const Product = require('Product_Schema_Module_Path'); // Edit 

const CatalogueSchema = new mongoose.Schema({ 

    apiKey: String, 
    domain: String, 
    totalcount: Number, 
    totaldone: Number, 
    allSKUS: Array, 
    allProducts: [Product.schema] 
    // Note the change here (Array -> [Product.schema] 
    // Creating a separate schema ensures automatic id (ObjectId) 

}, { collection: 'catalogue', timestamps: true }); 

CatalogueSchema.plugin(uniqueValidator); 

const Catalogue = mongoose.model('Catalogue', CatalogueSchema); 
module.exports = Catalogue; 

製品のスキーマ

const ProductSchema = new mongoose.Schema({ 

    id: Number, 
    sku: String, 
    name: String, 
    status: Number, 
    total_images: Number, 
    media_gallery_entries: Array 

}, { _id: true, timestamps: true }); 
// _id option is true by default. You can ommit it. 
// If _id is set to false, it will not add ObjectId 

ProductSchema.plugin(uniqueValidator); 

const Product = mongoose.model('Product', ProductSchema); 
module.exports = Product; 

EDIT(カタログで保存プロダクツ)(ObjectIdがの追加確保する新スキーマ)

(また、あなたはCatalogueSchemaモジュールにProductSchemaモジュールを必要としなければならないことに注意)

// Map userApiProducts.allProducts to array of Product documents 
const products = userApiProducts.allProducts.map(product => { 
    return new Product(product); 
}) 

const newProduct = { 
    apiKey: userApiProducts.apiKey, 
    domain: userApiProducts.domain, 
    totalcount: userApiProducts.totalcount, 
    totaldone: userApiProducts.totaldone, 
    allSKUS: userApiProducts.allSKUS, 
    allProducts: products 
}; 

Catalogue 
    .findOneAndUpdate({ domain: userApiProducts.domain }, newProduct, { upsert:true } , (err, products) => { 
    // Handle error 
}); 
+0

あなたのメソッドでは、[Product.schema]が定義されていません。CataloguesSchemaにProductsSchemaモデルを保存する方法を教えてください。 –

+0

個別の 'CatalogueSchema'と' ProductSchema'を別々のモジュールで作成します。 'CatalogueSchema'に' ProductSchema'をインポートしてください。カタログに商品を追加するコードを追加しました。 –

+0

うわー、それは実際に働いた。サンタヌーありがとう! –

0

:マングースで

あなたがModel.insertMany()を使用することができます。

しかし、ある文書がMongooseの他の文書の中にあるとき、Mongoの文書のように実際には格納されていないことに注意してください。 Mongoは、親文書にその内容を保存するのではなく、子文書のIDのみを格納します。また、これらのIDが属するコレクションに関する情報も保存しません。

人口を使用すると、Mongooseは実際にはMongoへの別の要求でDBから関連文書を取得します。だから、人口はモンゴースの概念です。 MongoはIDを保存するだけなので、IDを挿入する前にまずドキュメントを作成する必要があります。

モングースを使わずにしようとしていることは簡単でしょう。必要に応じて、独自のIDを使用してMongoの1つのリクエストに複数のドキュメントを格納することができます。また、そのIDの配列を持つ別のドキュメントを別の要求に格納できます。

もちろん、Mongoはトランザクションをサポートしていないため、操作中に矛盾した状態になることがあります。

+0

私はinsertManyを試してみましたが、それはオブジェクトIDを生成しません。別のスキーマで製品を生成し、.findを使用してそれらを照会することで、他の方法で試してみると。バッチ処理では、別のドキュメントの中にドキュメントを置くより少し遅くなるでしょうか? –

関連する問題