sql >> データベース >  >> NoSQL >> MongoDB

MongoDBはサブドキュメントを検索し、結果を並べ替えます

    前述のように、ドキュメントに実際に配列が含まれていることを願っていますが、$ elemMatchが機能している場合は、そうする必要があります。

    いずれにせよ、findを使用して配列内の要素で並べ替えることはできません。ただし、を使用してこれを実行できる場合があります。 .aggregate()

    db.collection.aggregate([
    
        // Match the documents that you want, containing the array
        { "$match": {
            "nlp.entities": {
                "$elemMatch": { 
                    "text": "Neelie Kroes", 
                    "type": "Person"   
                }
            }
        }},
    
        // Project to "store" the whole document for later, duplicating the array
        { "$project": {
            "_id": {
                "_id": "$_id",
                "url": "$url",
                "nlp": "$nlp"          
            },
            "entities": "$nlp.entities"
        }},
    
        // Unwind the array to de-normalize
        { "$unwind": "$entities" },
    
        // Match "only" the relevant entities
        { "$match": {
            "entities.text": "Neelie Kroes", 
            "entities.type": "Person"   
        }},
    
        // Sort on the relevance
        { "$sort": { "entities.relevance": -1 } },
    
        // Restore the original document form
        { "$project": {
            "_id": "$_id._id",
            "url": "$_id.url",
            "nlp": "$_id.nlp"
        }}
    ])
    

    つまり、基本的に、 $ match 関連する一致を含むドキュメントの条件として、<を使用します。 code> $ project 元のドキュメントを_idに「保存」します フィールドと $ unwind 「エンティティ」配列の「コピー」。

    次の $ match 配列の内容を、関連するものだけに「フィルタリング」します。次に、 $ sortを適用します。 「一致した」ドキュメントに。

    「元の」ドキュメントは_idの下に保存されていたため 、 $ projectを使用します ドキュメントが実際に最初に必要だった構造を「復元」するため。

    これが、配列の一致した要素を「ソート」する方法です。

    if 親ドキュメントの配列内に複数の「一致」がある場合は、追加の $ group 並べ替えを完了するために、「関連性」フィールドの$max値を取得するステージ。




    1. ダイヤルtcp[::1]:6397:connectex:ターゲットマシンがアクティブに拒否したため、接続できませんでした

    2. エラー:子プロセスが失敗し、エラー番号48で終了しました

    3. MongoTemplateを使用してソートされた個別の値を取得します

    4. MongoDBで文字列の日付をISOの日付に変更しますか?