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

geoNearによってサブドキュメントを取得します-MongoDB

    $geoNearの下のオプション includeLocsです 次のように:

    Store.aggregate([
        { "$geoNear": {
            "near": [ -70.64341379999999, -33.4268697 ],
            "distanceField": "distance", 
            "maxDistance": 0.0900899926955034,
            "includeLocs": "location"
        }}
    ])
    

    出力には、出力フィールドの「距離」と一致する「場所」があります。

    {
        "_id" : ObjectId("5507b18d1c3bdce0535aecd0"),
        "name" : "store1",
        "branchoffices" : [
                {
                        "name" : "bo1",
                        "location" : [
                                -70.64341379999999,
                                -33.4268697
                        ]
                },
                {
                        "name" : "bo2",
                        "location" : [
                                80.4,
                                43.3
                        ]
                }
        ],
        "distance" : 0,
        "location" : [
                -70.64341379999999,
                -33.4268697
        ]
    }
    

    試合で使用された配列内の特定のサブドキュメントを詳細に知りたい場合は、 $redact

    Store.aggregate([
        { "$geoNear": {
            "near": [ -70.64341379999999, -33.4268697 ],
            "distanceField": "distance", 
            "maxDistance": 0.0900899926955034,
            "includeLocs": "location"
        }},
        { "$redact": {
            "$cond": [
                { "$eq": [ "$location", "$$ROOT.location" ] },
                "$$DESCEND",
                "$$PRUNE"
            ]
        }}
    ])
    

    または、MongoDB 2.6より前のバージョンでは次のようになります:

    Store.aggregate([
        { "$geoNear": {
            "near": [ -70.64341379999999, -33.4268697 ],
            "distanceField": "distance", 
            "maxDistance": 0.0900899926955034,
            "includeLocs": "location"
        }},
        { "$unwind": "$branchoffices" },
        { "$project": {
            "name": 1,
            "branchoffices": 1,
            "matched": {
                "$eq": [ "$location", "$branchoffices.location" ]
            }
        }},
        { "$match": { "matched": 1 } },
        { "$group": {
            "_id": "$_id",
            "name": { "$first": "$name" },
            "branchoffices": { "$push": "$branchoffices" },
            "distance": { "$first" "$distance" }
        }}
    ])
    

    サブドキュメント内でオブジェクトを使用することが常に最適なソリューションであるとは限らず、通常、さまざまなタスクには適していないことに注意してください。たとえば、配列内のデータに、クエリされたポイントの「近く」にある「複数の」場所が含まれている可能性がある場合、このように一致できるのは単一の「最も近い」ポイントのみです。

    したがって、これを行うことはできますが、それをどのように使用しているか、および期待する結果を検討するのが最善です。ほとんどの場合、位置データは、ここで行われるようにサブドキュメント配列の下ではなく、独自のドキュメントにリストする必要があります。




    1. CDPの運用データベース

    2. MongoDBアグリゲートに自動インクリメントフィールドを追加するにはどうすればよいですか?

    3. 空のMongoDBデータベースが非常に大きいのはなぜですか?

    4. 異なる埋め込み構造を同じ名前で投影します