【问题标题】:perl mongodb geospatial array insert failsperl mongodb地理空间数组插入失败
【发布时间】:2013-05-29 23:58:11
【问题描述】:

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

}

【问题讨论】:

  • eval 中的代码甚至无法编译。您的 MongoDB(和 MongoDB 驱动程序)也严重过时,但这与您的问题无关。
  • 是的,正如我们所说,正在计划更新 mongodb。对不起评估,一个糟糕的剪切和粘贴......现在应该是正确的

标签: perl mongodb


【解决方案1】:

我不是地理索引方面的专家,但我认为您的坐标顺序可能有误。根据二维索引的documentation,数组需要采用[ long, lat ] 的形式,但你有[ lat, long ]。我的猜测是索引器发现 lat/long 值超出范围。

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

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

【讨论】:

  • 是的,我对 2d 也不太了解......你是对的。我已经做出了改变。现在我从 MongoDB 驱动程序收到此错误:[error] type (Math::BigFloat) unhandled at /usr/local/lib/perl5/site_perl/5.12.4/x86_64-linux/MongoDB/Collection.pm line 376。跨度>
  • MongoDB 驱动程序内部不支持 BigFloats,但没有理由将它们用于纬度和经度值。 (如果您需要在 32 位 perl 上处理 64 位整数,我们确实支持 Math::BigInt。)您应该能够将它们作为普通标量插入。如果它们在数据库中显示为字符串,请将@​​987654325@ 添加到它们以强制它们浮动。 (更新答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2018-03-12
  • 2015-06-07
相关资源
最近更新 更多