0

我在 perl Mojolicious 应用程序中运行以下代码。它运行的集合具有应用于“loc”属性的二维索引,该属性是 [lat, long] 形式的 2 元素数组。

MongoDB 是 2.0.1,perl MongoDB 是 0.46。perl 是 64 位的

删除 2d 索引后,我可以毫无困难地推动插入/更新新文档。应用索引时,last_error 返回“预期位置对象,位置数组格式不正确”

我尝试过多种方式操作经纬度输入,但无济于事。这是代码......有什么想法吗?

sub checkmein {
    my $self = shift;
    my $mail = $self->stash('mail');
    my $lat  = $self->param('lat');
    my $lng  = $self->param('long');

    # upsert

    my $c = $self->db->checkins;
    $mail = lc $mail;

    my $now = time;
    my @loc = (Math::BigFloat->new($lng),Math::BigFloat->new($lat));

        $c->update(
            {'mail'=>$mail }, 
            { 'mail'=>$mail, 'when'=>$now, 'loc'=>\@loc  }, 
            { upsert=>1 }
        );

    my $err = $self->db->last_error();

    if (defined $err->{'err'}) {
            $self->render(json=>{'status'=>'error','message'=>"Problem checking in $mail to $lat,$lng"});
    } else {
            $self->render(json=>{'status'=>'ok','message'=>"$mail checked in to $lat,$lng"});
    }

}

4

1 回答 1

1

我不是地理索引方面的专家,但我认为您的坐标可能顺序错误。根据 2d 索引的文档[ long, lat ],数组需要采用[ lat, long ]. 我的猜测是索引器发现纬度/经度值超出范围。

你也不能将 Math::BigFloat 值插入 MongoDB,但如果 perl 认为它们是字符串,你可以通过向它们添加零来让 perl 认为你的值是浮点数。

$lat += 0;
$lng += 0;
于 2013-05-29T15:26:37.093 回答