Perl从MongoDB获取数组元素

时间:2018-08-25 10:43:11

标签: mongodb perl

我想获取数组元素并存储在Perl变量中。如果我将0替换为?中的$cur->{Type}[?]->{_id},则只能得到一个数组元素,但我需要全部。以下是我的收藏集

{
    "_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 :(得分:3)

您快到了。首先,我将您的数据固定为JSON,但这没什么大不了的:

export enum MyWorkflowComponentState {
    Selecting, // Select "sub models"
    Editing, // Edit parent model
    Displaying,
    ...
}

@Component()
export class MyWorkflowComponent {
    myWorkflowComponentState = MyWorkflowComponentState;

    @Input()
    state: MyWorkflowComponentState;
    model: MyModel;
    ...
}

<div [ngSwitch]="state">
    <div *ngSwitchCase="myWorkflowComponentState.Selecting">
        <app-select [model]="model"> </app-select>
    </div>
    <div *ngSwitchCase="myWorkflowComponentState.Editing">
        <app-edit [model]="model"> </app-edit>
    </div>
    <div *ngSwitchCase="myWorkflowComponentState.Displaying">
        <app-display [model]="model"> </app-display>
    </div>
    ...
</div>

这是一个JSON数组,因此您可以一次遍历一个元素。在显示为数组引用的Perl中,使用v5.20中引入的postfix dereference使它变得可口(但没有它就不那么难了):

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

诀窍是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可以做到这一点。它对每一个都运行一次并输出行。