Perl mongodb地理空间数组插入失败



我在一个perl Mojolicious应用程序中运行以下代码。它运行的集合有一个2d索引应用于"loc"属性,这是2元素数组的形式[lat, long]。

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"});
    }

}

我不是地理索引方面的专家,但我认为你的坐标可能顺序不对。根据2d索引的文档,数组需要以[ long, lat ]的形式存在,但是您有[ lat, long ]。我的猜测是索引器发现一个长/长值超出了范围。

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

$lat += 0;
$lng += 0;

最新更新