2016-08-25 4 views
1

は、私は私が"Where are the cell towers in my state?"node.js MongoDB 2dsphere find()コールで何が問題になっていますか? MongoDBので

最初のコレクションは、国勢調査のデータから作成された質問に答えるのを助けることを使用するための2つのコレクションを持っており、それは国家の境界のポリゴンを持っています。

2番目のコレクションは、OpenCellIdデータベースをダウンロードしてインポートすることで作成されました。 "l"はタワーの位置座標キーです。

JavaScriptコードは状態を取得し、その状態でタワーを印刷する必要があります。

これは、find()呼び出しでstateBounds変数の代わりにネバダ州のポリゴンのテキスト(コピー/ペースト)を使用してこれを達成しました。

しかし、コピー/ペーストの代わりに全く同じオブジェクトを渡すと、console.log("Tower found: %j", item);コールで"Tower found: [Circular]"が印刷されます。

const mongoUrl = 'mongodb://localhost:27017/test'; 
const hostname = '127.0.0.1'; 
var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect(mongoUrl, function(err, db){ 
    var towers = db.collection('celltowers'); 
    var states = db.collection('states'); 
    states.findOne({"properties.STUSPS": "NV"},function(err, item){ 
     getTowers(towers, item); 
    }); 

}); 

function getTowers(celltowers, state) { 
    var stateBounds = JSON.stringify(state, "geometry.coordinates"); 
    celltowers.find({l:{$geoWithin:{$geometry:{type: "Polygon", coordinates: stateBounds}}}}, function(err, item) { 
     console.log("Tower found: %j", item); 
    }); 
} 

のgeojsonポリゴンを使用する必要があります。

私はこれを修正するために何ができますか?

+0

あなたのコード 'JSON.stringify(state、" geometry.coordinates ");'でこの行の意図が分かりますか? 'stateBounds'のコンソールを追加して値を確認できますか?それは適切ですか? – Shrabanee

+0

JSON.stringifyはgeojson状態のプロパティを選択します。私はgeometry.coordinatesを選択するだけの座標とアドレス(必要なら)を必要としました。その呼び出しの結果をコピーして貼り付け、stateBoundsを置き換えることにより、find()が機能しました。ですから、コピー/ペーストがうまくいったので、それは適切だと思います。 –

+0

Jsonを使って試した方法。弦は正しい方法ではありません。 Jsonオブジェクトから必要なフィールドだけを取得する方法については、いくつかのドキュメントを参照してください。 – Shrabanee

答えて

0

以下のようにあなたのデシベルと仮定すると:あなたがしようとしたクエリであることは適切ではない

{ 
    //Some more fields as well 
    geometry:{coordinates : [0,12]}; 
} 

。レコード全体にstateを入力してみました。coordinatesとしています。代わりに、検索クエリのレコードから座標の値を渡す必要があります。

これはあなたの問題を解決することがあります。 -

function getTowers(celltowers, state) { 
    var stateBounds = JSON.stringify(state); 

    celltowers.find({l:{$geoWithin:{$geometry: 
    { 
    type: "Polygon", 
    coordinates: stateBounds.geometry.coordinates //Change is here. 
    } 
    }}}, function(err, item) 
    { 
    console.log("Tower found: %j", item); 
    }); 
} 

あなたが使用する方法の詳細についてはdocをREFEREことがあります。

+0

次の行は、状態の座標をfind()に渡されるstateBounds変数に割り当てます。var stateBounds = JSON.stringify(state、 "geometry.coordinates"); –

+0

あなたはコンソールを持ってチェックしましたか?私が試したとき、それは私にオブジェクト全体を与えました。 – Shrabanee

+0

はい。コンソールに表示されているものを貼り付けるときに動作します。それはキッカーだ。 –

関連する問題