2017-07-17 5 views
0

でネストされたすべての文書を削除する方法:JS/MongoDBは:いくつかの主要な文書といくつかの子供たちがある私のMongoDBで指定された親のタイトル

{ _id: 'KZg2RgcnxdfYbAoog', 
title: 'Article Sample', 
type: 'articles' } 

{ _id: 'YbAoogKZg2Rgcnxdf', 
parent: 'KZg2RgcnxdfYbAoog' } 

は、今私は、メインのタイトルを使用して、完全なデータセットを削除する必要があります資料。

私のアプローチは、まず、指定されたタイトル配列に一致するすべてのドキュメントを取得することです。これらのIDを使用して、このidまたはparentのすべての文書を削除しようとしました。 しかし、このコードでは削除されません。 articlesは未定義のようです...

また、完全なコードは、この単純なタスクにとって非常に巨大に見えます。これは少しスマートにできますか?

MongoClient.connect(mongoUrl, function (err, db) { 
    expect(err).to.be.null 
    console.log('Connected successfully to server: ' + mongoUrl) 

    var articles = db.collection('articles') 
    var titleArray = ['Article Sample', 'Another sample'] 

    articles.find({ title: { $in: titleArray } }).toArray((err, docs) => { 
    if (err) console.warn(err) 
    if (docs && docs.length > 0) { 
     docs.forEach(doc => { 
     articles.remove(
      { 
      $or: [ 
       { _id: doc._id }, 
       { parent: doc._id }, 
       { main: doc._id } 
      ] 
      }, 
      (err, numberOfRemovedDocs) => { 
      console.log(numberOfRemovedDocs) 
      } 
     ) 
     }) 
    } 
    }) 

    db.close() 
}) 

答えて

0

何かを見つける前にdb接続を終了しています。 articles.findは非同期で、その直後にdb.close()を実行します。

それはこのようなものでなければなりません:

articles.find({ title: { $in: titleArray } }).toArray((err, docs) => { 
    if (err) console.warn(err) 
    if (docs && docs.length > 0) { 
     Promise.all(
     docs.map(doc => 
      articles.remove(
      { 
       $or: [ 
       { _id: doc._id }, 
       { parent: doc._id }, 
       { main: doc._id } 
       ] 
      } 
     ) 
     ) 
    ) 
     .then((res)=>{ 
     res.map((res)=>{console.log(res.result.n)}); //numberOfRemovedDocs per title 
     db.close() 
     }) 
     .catch(()=>{db.close()}) 
    } else { 
     db.close() 
    } 
    }) 
関連する問題