2016-05-16 5 views
2

Node.JS、MONGODB、Mongooseを使用していません。MongoDB Upserts変数名をキー(Node.JS)

私に保存しているドキュメントがあります。私はUPSERTを使用する場合は、そのような構造のデータを:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), 
     "document" : 
       [ {"name" : "SomeName" } ] 
} 

私が使用してそれがルートレベルにそれをすべて挿入INSERT:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), "name" : "SomeName" } 

これは明らかに矛盾の多くにつながるとしています。私は様々なことを試みました。私はfindOneAndReplace、Upsertで更新、私は置換、$ setOnInsertを試してみました。 Upsertが関与しているときは、それはすべて同じことをする。

はI [0]配列の最初のブロックにアクセスするために文書を使用するように試みたが、それは...エラーをスロー「予期しないトークンを[」

Iはを通じて時間の様々な方法を試して掘りましたさまざまな文書を作成し、この問題を抱えている誰かのために高いものと低いものを検索しましたが、他の誰かのために十分に文書化されていないようです。

誰もがすべてのフィールドが変数名の下にネストされていないROOTレベルにあることを確認するための推奨事項はありますか?以下の関連コード。

findReplace: function(db, document, collection) { 

    var dbCollection = db.collection(collection); 

    var filter = document.name; 

    return new Promise(function(resolve, reject) { 
     dbCollection.updateOne({ 
      "name" : filter 
     }, { 
      document 
     }, { 
      upsert: true 
     }, function(err, result) { 
      if (err) { 
       console.log('error', err) 
       reject(err); 
      } 
      console.log("Found Document and Upserted replacement Document"); 
      resolve([{'status' : 'success'}]); 
     }); 
    }); 
} 

答えて

1

あなたがこれを行うとき:

{ 
    document 
} 

をあなたは、その値としてdocumentプロパティと変数の値を含むオブジェクトを作成している:

{ 
    document: [ {"name" : "SomeName" } ] 
} 

This is new functionality from ES6。ドキュメント変数の最初の項目にアクセスする場合は、新しいオブジェクトを作成しないでください。

return new Promise(function(resolve, reject) { 
    dbCollection.updateOne({ 
     "name" : filter 
    }, document[0], { // <======== 
     upsert: true 
    }, function(err, result) { 
     if (err) { 
      console.log('error', err) 
      reject(err); 
     } 
     console.log("Found Document and Upserted replacement Document"); 
     resolve([{'status' : 'success'}]); 
    }); 
}); 
+0

完璧、ありがとう!私はES6の変化に追いつこうとしてきましたが、常に新しいものでした。それは常に小さなものです。 – FouMedia

関連する問題