Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^7: MongoDB replacing an array

by Mr. Muskrat (Abbot)
on Aug 26, 2012 at 23:38 UTC ( #989891=note: print w/ replies, xml ) Need Help??


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

I'm hoping that I can learn a bit about MongoDB from trying to help you. Is the update happening within the @cols foreach loop? How are you getting $col? $col = $db->$cols;?

Based on your @new foreach print, it looks like you are storing multiple timestamps in each record. Is that what you intended? If so, it seems odd to me to store timestamps in a column named timestamp. :)


Comment on Re^7: MongoDB replacing an array
Download Code
Re^8: MongoDB replacing an array
by neilwatson (Curate) on Aug 27, 2012 at 00:21 UTC

    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

      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
Node Status?
node history
Node Type: note [id://989891]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (6)
As of 2014-09-03 07:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (35 votes), past polls