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

保存されたサークル内の場所を検索する

    オリジナルよりもさらに最適で、 $expr $match 最初の $geoNearの後のステージ :

    db.collection.aggregate([
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [ 23.027573, 72.50675800000001 ],
            },
            "distanceField": "distance"
        }},
        { "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
    ])
    

    実際、最初に書いたときよりも少し最適です。これで、 $redactを実行できます。 $projectではなく ブール値と $match 後で:

    db.collection.aggregate([
        // Match documents "near" the queried point
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [ 23.027573, 72.50675800000001 ],
            },
            "distanceField": "distance"
        }},
    
        // Calculate if distance is within radius and remove if not
        { "$redact": {
            "$cond": {
                "if": { "$lte": [ "$distance", "$radius" ] },
                "then": "$$KEEP",
                "else": "$$PRUNE"
            }
        }}
    ])
    

    情報を正確に保存しましたが、結果を得るには思ったものとは異なるアプローチがあります。

    使用したいのは $geoNear 具体的には、集約フレームワーク その演算子の形式。これがあなたがすることです:

    db.collection.aggregate([
        // Match documents "near" the queried point
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [ 23.027573, 72.50675800000001 ],
            },
            "distanceField": "distance"
        }},
    
        // Calculate if distance is within radius
        { "$project": {
            "location": 1,
            "radius": 1,
            "distance": 1,
            "within": { "$lte": [ "$distance", "$radius" ] }
        }},
    
        // Match only documents within the radius
        { "$match": { "within": true } }
    ])
    

    そのため、このフォームでは、クエリされたポイントからの距離を結果に「投影」できますが、クエリは最も近いドキュメントのみを返します。

    次に、論理比較を使用して、「距離」の値が「半径」よりも小さいかどうか、つまり円内にあるかどうかを確認します。

    最後に、その「範囲内」のアサーションが真である結果のみを除外するために一致します。

    $geoNearに他のオプションを追加できます ドキュメントに示されているように。また、ストレージでもGeoJSON形式を使用することを強くお勧めします。これは、取得した結果を処理するために使用する可能性のある他のライブラリとの互換性が高い可能性があるためです。



    1. 非同期サブタスクを使用した非同期カーソルの反復

    2. Stripewebhooksイベントの順序

    3. React.jsでMongoDBドキュメントを挿入します

    4. 確実にMongoDBに再接続する