2017-09-10 13 views
1

以下のような変更の履歴を保持するコレクションがあります。つまり、変更されたサブdocの古い値と新しい値を保持します。mongoDB未知のフィールド名を持つ同じ文書内の2つのフィールドを比較する方法

例:基本サブ文書で名前のみが変更された場合、基本文書全体が古いセクションに配置されます。

古いセクションのすべてのフィールド名を知らなくても、すべてのフィールドが変更されたことを確認して印刷します。

例:「basic.name」は「transactionDetails.old.basic.name」と等しく、falseの場合は印刷します。

"transactionDetails.old.basic.name"が存在するかどうかはわかりませんが、

私の要件: 1) "transactionDetails.old"の最初のフィールドは何ですか 2)それが新しいフィールド値と等しいかどうかチェックし、falseなら印刷してください。 3)このようなものについてはどのように

db.collection.findOne() 
{ 
    "basic": { 
     "name": "newName", 
     "companyName": "NewCompany", 
     "address": "NewAddress" 
    }, 
    "official": { 
     //New official stuff 
    }, 
    "transactionDetails": { 
     "old": { 
      "basic": { 
       "name": "OldName", 
       "companyName": "OldCompany", 
       "address": "OldAddress" 
      }, 
      "official": { 
       //Old official stuff 
      } 
     } 
    } 
} 

答えて

0

「transactionDetails.old」のdocに次のフィールドについて上で繰り返します。これができればこれに費やしたあなたの努力のための

collection.aggregate({ 
    $project: { 
     "old": "$transactionDetails.old", // store everything in "transcationDetails.old" in the "old" field 
     "new": "$$ROOT", // store the entire document in the "new field" 
     "_id": 0 // get rid of "_id" field 
    } 
}, { 
    // ugly hack which won't do anything really because of what seems like a bug in a MongoDB bug (UPDATE: I tried to test that again, couldn't reproduce the error, though, and I cannot remember which version I was running on back then. So you might well want to try the query without this stage...): 
    // without this (or any other probably) stage here, I guess, 
    // MongoDB attempts to combine the two project stages but returns the wrong document... 
    $sort: { 
     "whatever": 1 
    } 
}, { 
    $project: { 
     "new._id": 0, // get rid of inner "_id" field 
     "new.transactionDetails": 0 // get rid of inner "transactionDetails" field 
    } 
}, { 
    $project: { 
     "newArray": { $objectToArray: "$new" }, // transform "new" field into array of key-value pairs 
     "oldArray": { $objectToArray: "$old" }, // do the same for "old" 
    } 
}, { 
    $project: { 
     "difference": { 
      $arrayToObject: { // transform array of key-value pairs back to document 
       $filter: {        // run a filter... 
        input: "$oldArray",     // ...on the "oldArray" field... 
        cond: {        // ...which will throw out all items... 
         $not: [{       // ...that do not... 
          $in: [ "this", "$newArray" ] // ...also appear identically in the "newArray" field 
         }] 
        } 
       } 
      } 
     } 
    }}) 
+0

おかげで多くのことを、私がチェックします – Varun

+0

残念ながら、MongoDB 3.2.11ではサポートされていないので、$ objectToArrayを使用することはできません。それ以外の方法はありますか? – Varun

+0

残念ながら、そこにはないと思います...アップグレードはオプションではありませんか? – dnickless

関連する問題