0

perl Mojolicious アプリで次のコードを実行しています。それが実行されるコレクションには、フォーム [lat, long] の 2 つの要素配列である「loc」プロパティに適用される 2d インデックスがあります。

MongoDB は 2.0.1、perl MongoDB は 0.46 です。パールは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 に答える