Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^8: MongoDB replacing an array

by neilwatson (Priest)
on Aug 27, 2012 at 00:21 UTC ( [id://989894]=note: print w/replies, xml ) Need Help??


in reply to Re^7: MongoDB replacing an array
in thread MongoDB replacing an array

Yes, I am getting $col as you describe. No issue there. Yes, multiple timestamps in a record. This is what I intend.

Neil Watson
watson-wilson.ca

Replies are listed 'Best First'.
Re^9: MongoDB replacing an array
by Mr. Muskrat (Canon) on Aug 27, 2012 at 03:02 UTC

    Perhaps my short example script that seems to be working will help shed some light on what's wrong with yours? At the very least, I've gotten a little exposure to MongoDB out of this experience.

    #!/bin/env perl use strict; use warnings; use Data::Dumper; use MongoDB; use Try::Tiny; my $conn; # the connection can fail try { $conn = MongoDB::Connection->new; } catch { chomp( my $err = $_ ); $err =~ s/ at .*//; die "Unable to connect to the default MongoDB ($err)"; }; my $db = $conn->mydb; # shouldn't ever die because MongoDB will create + it if it doesn't exist my $hosts = $db->hosts; # ditto $hosts->insert({host => "127.0.0.1", timestamp => [ qw( 20110101 20110 +202 20110303 ) ]}); $hosts->insert({host => "127.0.0.2", timestamp => [ qw( 20110101 20110 +202 20110303 ) ]}); $hosts->insert({host => "127.0.0.3", timestamp => [ qw( 20110707 20110 +808 20110909 ) ]}); $hosts->insert({host => "127.0.0.1", timestamp => [ qw( 20111010 20111 +111 20111212 ) ]}); $hosts->insert({host => "127.0.0.2", timestamp => [ qw( 20110404 20110 +505 20110606 ) ]}); my $all_hosts = $hosts->find; my $ts; while ( my $host = $all_hosts->next ) { push @{$ts->{$host->{host}}}, @{$host->{timestamp}}; } # add non-existant host just to try and get an exception $ts->{'127.0.0.4'} = [ qw( 20120606 ) ]; $all_hosts->reset; for my $host ( keys %$ts ) { print "Updating $host..."; my @new = @{ $ts->{$host} }; # I wasn't able to get it to die even when trying to update a non- +existant record # $rc->{updatedExisting} will contain a true/false value but $rc-> +{err} is always undef # but I feel better trying to catch the croak my $rc; try { $rc = $hosts->update( { host => $host }, { '$set' => { timestamp => [ @new ] } }, { multiple => 1, safe => 1 } ); } catch { warn sprintf( "Couldn't update records for host %s, %s", $host +, $_ ); }; print $rc->{updatedExisting} ? 'success' : 'failure', "\n"; } while ( my $host = $all_hosts->next ) { printf "%s => %s\n", $host->{host}, Dumper( $host->{timestamp} ); } $hosts->drop; $db->drop;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://989894]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2024-04-26 00:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found