【问题标题】:Return null object with PHP using MongoDB $near query使用 MongoDB $near 查询使用 PHP 返回空对象
【发布时间】:2013-07-06 23:07:02
【问题描述】:

我正在使用 PHP 和 MongoDB 来解决问题并获得离我的位置最近的点。但我有一个问题。

当我使用 mongo 控制台时,它会返回值,但是当我使用 PHP 代码时,它会返回一个空对象。

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”:“星期二,2013 年 7 月 9 日 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”:“星期二,2013 年 7 月 9 日 06 :38:15" }

如果我在我的 PHP 代码中使用相同的值,它会返回一个空游标。为什么?谢谢!

【问题讨论】:

  • 此处无需在您的问题中添加“已解决”:这不是论坛,而是问答网站:答案是独立的实体:因此您可以添加自己的答案,并将其选为 '公认'。你可以从你的问题中删除答案:)
  • 不用担心,+1 回答:D

标签: php mongodb gps position


【解决方案1】:

根据这个MongoDB $near doc 查询应该是这样的:

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

你应该在调用之前使用 isset 函数检查 $_GET['longtitude'] 等等。

【讨论】:

  • 谢谢,问题是我的请求将游标返回到一个数组,而我试图直接从 $cursor 访问,这是错误的。我已经用正确的答案更新了我的问题。
  • 将其发布为答案并接受,以便每个人都可以查看您的答案
【解决方案2】:

我有办法。

我遇到的问题是我试图直接返回 $cursor 但 $collection->find($query) 返回超过 1 个对象(注意 $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' }";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多