mongodb version v3.6.1
こういうしょうもない設計のレコードが50万件くらいあります。
mongoDB
1{ 2 "_id" : ObjectId("5a51d36bf7a162fcfea3d119"), 3 "detail" : { 4 "shop_id" : 3, 5 "keyword" : "s_1", 6 "s_1" : { 7 "hoge" : false, 8 } 9 } 10}, 11{ 12 "_id" : ObjectId("5a51d36bf7a162fcfea3d111"), 13 "detail" : { 14 "shop_id" : 134, 15 "keyword" : "s_2", 16 "s_2" : { 17 "hoge" : true, 18 } 19 } 20}, 21{ 22 "_id" : ObjectId("5a51d36bf7a162fcfea3d112"), 23 "detail" : { 24 "shop_id" : 569, 25 "keyword" : "s_3", 26 "s_3" : { 27 "hoge" : true, 28 } 29 } 30}
これをmongoDB上だけで「"hoge" : true」の数をカウントしたいです。
上記のデータの場合「2」ということになります。
単純にカウントするだけなら簡単なのですが、問題は"detail"のs_1、s_2、s_3が全部uniqueな値なので、単純に
mongoDB
1"detail.s_1.hoge" : true
という条件式が書けません。
ただし、s_1、s_2、s_3というフィールド名は、必ず"detail.keyword"の値と同じです。
何か策はないものでしょうか。。。
フィールド名を$renameで変更してtemp collectionを作ろうかとも思ったのですが、やはりs_1、s_2、s_3がuniqueな値であるところでつまづきます。
レコード数が多いのでnode.jsやPHPなどは使わず、mongoDB内で完結するのがミッションです。
追記:
いきなりカウントするのは無理そうなので、いったん別のcollectionにフィールド名を修正して書き出そうとしてみました。
まだ途中なのでoutのところは書いていないですが、フィールド名を上書きする部分だけを書いてみました。
mongodb
1db.test.find().forEach(function(doc){ 2 let shopName = doc.shop_detail.key; 3 shopName = "shop_detail." + shopName; 4 db.test.update( { "_id" : doc._id }, { "$rename": { shopName:"shop_detail.data" } } ); 5})
エラーは出ないのですが上書きもされません。
う〜ん、ちょっと行き詰まっているのでどなたか助けてください。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。