Perl получает элемент массива из mongodb - PullRequest
0 голосов
/ 25 августа 2018

Я хотел получить элемент массива и сохранить его в переменной Perl.Если вместо ? вместо $cur->{Type}[?]->{_id} поставить 0, я смогу получить только один элемент массива, но хочу все.ниже моя коллекция

{
    "_id" : ObjectId("5b7fdb050cc3c23478005741"),
    "DBName" : "sample",
    "DBServerURL" : "mongodb://localhost:27017/",
    "Type" : [
        {
            "_id" : ObjectId("5b801dc963f8c81df83891bd")
        },
        {
            "_id" : ObjectId("5b801dc963f8c81df83891be")
        },
        {
            "_id" : ObjectId("5b801dc963f8c81df83891bf")
        },
        {
            "_id" : ObjectId("5b801dc963f8c81df83891c0")
        }
    ]
}

Я пытаюсь получить ObjectId из всех полей

$cursor = $CustColl->find(
    {DBName => "sample",DBServerURL => "mongodb://localhost:27017/"},{'_id' => 1, 'Type.$._id' => 1, 'DBServerURL' => 1, 'DBName' => 1}
);
while(my $cur = $cursor->next){
    my $cid = "$cur->{_id}" ;
    my $jid = "$cur->{Type}[?]->{_id}" ;
    my $url = "$cur->{DBServerURL}" ;
    my $name = "$cur->{DBName}" ;
    print "$cid : $jid : $url : $name\n" ;
}

Я хотел вывод, как показано ниже:

5b7fdb050cc3c23478005741 : 5b801dc963f8c81df83891bd : mongodb://localhost:27017/ sample
5b7fdb050cc3c23478005741 : 5b801dc963f8c81df83891be : mongodb://localhost:27017/ sample
5b7fdb050cc3c23478005741 : 5b801dc963f8c81df83891bf : mongodb://localhost:27017/ sample
5b7fdb050cc3c23478005741 : 5b801dc963f8c81df83891c0 : mongodb://localhost:27017/ sample

1 Ответ

0 голосов
/ 25 августа 2018

Вы почти у цели.Во-первых, я исправил ваши данные, чтобы они стали JSON, но это не имеет большого значения:

my $json = q([{
    "_id" : "5b7fdb050cc3c23478005741",
    "DBName" : "sample",
    "DBServerURL" : "mongodb://localhost:27017/",
    "Type" : [
        {
            "_id" : "5b801dc963f8c81df83891bd"
        },
        {
            "_id" : "5b801dc963f8c81df83891be"
        },
        {
            "_id" : "5b801dc963f8c81df83891bf"
        },
        {
            "_id" : "5b801dc963f8c81df83891c0"
        }
    ]
} ]);

use JSON::XS;
my $perl = decode_json( $json );

Это массив JSON, поэтому вы можете просматривать его по одному элементу за раз.В Perl, который отображается как ссылка на массив. Использование разыменования postfix , представленного в v5.20, делает это приемлемым (но не так сложно без него):

while(my $cur = shift $perl->@*){   # or @$perl
    my $cid = $cur->{_id} ;
    my $url = $cur->{DBServerURL} ;
    my $name = $cur->{DBName} ;
    foreach my $hash ( $cur->{Type}->@* ) {  # or @{ $cur->{Type} }
        my $jid = $hash->{_id};
        print "$cid : $jid : $url : $name\n" ;
    }
}

Хитрость в том, что$jid материал находится в другом массиве, и вы хотите пройти через это по отдельности.Для этого есть foreach внутри while.Он запускается один раз для каждого из них и выводит строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...