2016-12-16 17 views
1

これはmongoドキュメントのビューです。私は、キー値が最も長い文書内のエントリだけを残したいと思っています。ここでのキーの値が文字列なので、最長の文字列の長さを持つキーだけフィルタmongoドキュメント - python

{ 
    "_id" : ObjectId("585a431415c7a981b47ac4ee"), 
    "key" : "http://www.adnansami.com", 
    "value" : "A" 
} 
{ 
    "_id" : ObjectId("585a431415c7a981b47ac4ef"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BB" 
} 
{ 
    "_id" : ObjectId("585a431d15c7a981b47ac4f0"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "B" 
} 
{ 
    "_id" : ObjectId("585a431d15c7a981b47ac4f1"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "C" 
} 
{ 
    "_id" : ObjectId("585a432515c7a981b47ac4f2"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBB" 
} 
{ 
    "_id" : ObjectId("585a432815c7a981b47ac4f3"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CC" 
} 
{ 
    "_id" : ObjectId("585a432d15c7a981b47ac4f4"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBB" 
} 
{ 
    "_id" : ObjectId("585a433115c7a981b47ac4f5"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCC" 
} 
{ 
    "_id" : ObjectId("585a433615c7a981b47ac4f6"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBBB" 
} 
{ 
    "_id" : ObjectId("585a433d15c7a981b47ac4f7"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCC" 
} 
{ 
    "_id" : ObjectId("585a434915c7a981b47ac4f8"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCCC" 
} 

ままにする必要がありますので出力はどのように私はこれを達成することができます

{ 
    "_id" : ObjectId("58539dc715c7a964817686f9"), 
    "http://www.adnansami.com" : "A " 
    } 
    { 
    "_id" : ObjectId("585a433615c7a981b47ac4f6"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBBB" 
    } 
    { 
    "_id" : ObjectId("585a434915c7a981b47ac4f8"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCCC" 
    } 

すべきですか?

答えて

2

これは、ハッシュキーのためにmap-reduce操作に頼らずにmongoで照会するのは非常に複雑です。 Mongoのは、あなたの代わりに

{ 
    "_id" : ObjectId("58539dfa15c7a96481768700"),   
    "key": "http://www.leap-networks.com", 
    "value": "AAAAAAAA" 
} 

のようなキー/値の文書を持っている埋め込まれた構造と非常によく動作しますので、あなたはそれがインデックス可能な、より簡単にMongoDBで検索するために、ドキュメントの再構築を検討すべきです。上記提案されたスキーマの

、あなたは値フィールドの長さを計算するためのMongoDB 3.4 $strLenCP演算子使用できるアグリゲーションフレームワーク適用することができる:

db.collection.aggregate([ 
    { 
     "$addFields": { 
      "strLength": { 
       "$strLenCP": "$value" 
      } 
     } 
    }, 
    { "$sort": { "strLength": -1 } }, 
    { 
     "$group": { 
      "_id": "$key", 
      "value": { "$first": "$value" }, 
      "doc_id": { "$first": "$_id" }   
     } 
    }  
]) 

サンプル出力

{ 
    "doc_id": ObjectId("58539dc715c7a964817686f9"), 
    "_id" : "http://www.adnansami.com", 
    "value": "A "  
}, 
{ 
    "doc_id": ObjectId("58539dd515c7a964817686fc"), 
    "_id" : "http://www.movies.yahoo.com", 
    "value": "AAAA"  
}, 
{ 
    "doc_id": ObjectId("58539dfa15c7a96481768700"), 
    "_id" : "http://www.leap-networks.com", 
    "value": "AAAAAAAA"  
} 
+0

ドット表記のフィールド名が3行目の1行目で引用符で囲まれている必要があります。編集を試みましたが動作していません – Guru

+0

私は編集済みです変更との質問、私は私の文書で作った。この変更のドキュメントでは、私はあなたのクエリから 'ratings'を削除しました。遅れている応答のため申し訳ありません。 – Guru

+0

私はクエリに同じ変更を行いました。つまり、 'removed ratings'はまだ動作していませんか? – Guru

関連する問題