1

私は PHP と MongoDB を使用して痛みを感じ、自分の位置に最も近いポイントを取得しています。しかし、私には問題があります。

mongo コンソールを使用すると値が返されますが、PHP コードで実行すると null オブジェクトが返されます。

PHP コード:

$connection = new MongoClient( "mongodb://localhost" );
$db = $connection->collection;
$collection = $db->user_location;

// There are many differnt queries (by token, by email...)
if (isset($_GET['email'])) {
    $query = array(
    //'email' => array( '$neq' => $_GET['email']),
    'loc' => array(
        '$near' => array(
        'lon' => floatval($_GET['longitude']),
        'lat' => floatval($_GET['latitude']), 
        '$maxDistance' => intval($_GET['distance']))));
}

$maxDistance = $_GET["distance"];
$lon = $_GET['longitude'];
$lat = $_GET['latitude'];

$cursor = $collection->find($query);
if ($cursor) {
    echo json_encode($cursor);
} else {
    echo "{ 'status' : 'false' }";
}

これは mongo コンソールの使用例です: db.user_location.ensureIndex({ loc : "2d"} )

db.user_location.find() { "_id" : ObjectId("51dbe817617c6df061000000"), "email" : "zgz", "loc" : { "lon" : -0.88588498, "lat" : 41.68035677 }, "date" : "Tue, 09 Jul 2013 06:38:15" } db.user_location.find({"loc": {"$near": {"lon":-0.88588498,"lat":41.68035677}, "$maxDistance": 99}}) { "_id" : ObjectId("51dbe817617c6df061000000"), "email" : "zgz", "loc" : { "lon" : -0.88588498, "lat" : 41.68035677 }, "date" : "Tue, 2013 年 7 月 9 日 06:38:15" }

PHP コードで同じ値を使用すると、null カーソルが返されます。なんで?ありがとう!

4

2 に答える 2

1

私は解決策を持っています。

私が抱えていた問題は、 $cursor を直接返そうとしていましたが、 $collection->find($query) が複数のオブジェクトを返すことでした ($findOne() は 1 つしか返さないことに注意してください。したがって、返すのに問題はありません) $cursor)。その場合 (find() を使用)、iterator_to_array($cursor) を返す必要があります。

$cursor = $collection->find($query);
if ($cursor) {
    echo json_encode(iterator_to_array($cursor));
} else {
    echo "{ 'status' : 'false' }";
}
于 2013-08-19T13:54:29.923 に答える
1

このMongoDB $near docクエリによると、次のようになります。

$query = array(    
    'loc' => array(
        '$near' => array(
            floatval($_GET['longitude']),
            floatval($_GET['latitude']), 
        )
        '$maxDistance' => intval($_GET['distance'])),
    ),
);

また、呼び出す前にisset関数で $_GET['longtitude'] などを確認する必要があります。

于 2013-07-09T11:24:50.633 に答える