# -*- tcl -*- # # This is a sample test set using the low-level (pure tcl) interface # for inserting and querying tuples into MongoDB. # package require nsf puts stderr "PWD [pwd]" puts stderr "auto_path $auto_path" foreach p [lsort [package names]] { if {![catch {package present $p}]} { set l [format %-15s $p] puts stderr "loaded $l [package ifneeded $p [package require $p]]" } } package require nx::test package require nsf::mongo #nsf::configure debug 2 # # One might query the resulting tuples from the mongo shell via: # # mongo # > use tutorial # > db.persons.find(); # #set mongoConn [::mongo::connect -uri mongodb://127.0.0.1:27017/] ? {set mongoConn [::mongo::connect]} "mongoc_client_t:0" puts "Connection: $mongoConn" if {1} { #::mongo::collection::delete $mongoConn tutorial.persons {} # Drop old potenially old collection and # recreate it as a capped collection ::mongo::run -nocomplain $mongoConn tutorial {drop string persons} puts "\nCreate a capped collection:" ? {::mongo::run $mongoConn tutorial { create string persons capped bool 1 size int32 100000 }} "ok double 1.0" ? {set mongoColl [::mongo::collection::open $mongoConn tutorial persons]} "mongoc_collection_t:0" puts "Collection: $mongoColl" ? {mongo::collection::count $mongoColl {}} 0 puts "\nInserting a few tuples" ? {llength [::mongo::collection::insert $mongoColl \ [list name string Gustaf projects string nsf age int32 53]]} "12" ? {mongo::collection::count $mongoColl {}} 1 ::mongo::collection::insert $mongoColl \ [list name string Stefan projects string nsf] ::mongo::collection::insert $mongoColl \ [list name string Victor a array {0 string "x" 1 string "y"} age int 31] ? { set r [::mongo::collection::insert $mongoColl \ [list name string Joe \ projects string abc \ age int32 23 \ classes array {0 document {$ref string courses $id oid 1}}]] string match "_id oid *" $r } 1 ::mongo::collection::insert $mongoColl \ [list name string Franz info document {x int 203 y int 102} age int 29 projects string gtat] ::mongo::collection::insert $mongoColl \ [list name string Selim ts timestamp {1302945037 1} d date 1302947619279] ? {mongo::collection::count $mongoColl {}} 6 puts stderr "\nCreate an index on name (ascending)" ? {::mongo::collection::index $mongoColl [list name int 1]} 1 } puts stderr "\nFull content" ? {llength [::mongo::collection::query $mongoColl {}]} 6 puts stderr "\nProject members" ? { llength [::mongo::collection::query $mongoColl \ [list \$query document {projects string nsf} \$orderby document {name int 1}]] } 2 package req nx::mongo nx::mongo::Class create C set result [::mongo::run $mongoConn tutorial {distinct string persons key string name}] puts stderr "\nDistinct Persons: [C bson pp $result]" puts stderr "\nProject members of nsf sorted by name" ? { set r [lindex [::mongo::collection::query $mongoColl \ [list \$query document {projects string nsf} \$orderby document {name int 1}]] 0] string match *Gustaf* $r } 1 puts stderr "\nAge > 30 (all atts)" ? { set r [::mongo::collection::query $mongoColl \ [list \$query document {age document {$gt int 30}}]] set _ [llength $r]-[llength [lindex $r 0]] } 2-12 puts stderr "\nAge > 30 (only atts name and age, aside of _id)" ? { set r [::mongo::collection::query $mongoColl \ [list \$query document {age document {$gt int 30}}] \ -atts {name int 1 age int 1}] set _ [llength $r]-[llength [lindex $r 0]] } 2-9 puts stderr "\nCount Age > 30" ? {::mongo::collection::count $mongoColl {age document {$gt int 30}}} 2 puts stderr "\nAge > 30 (all atts, via cursor interface)" ? { set cursor [::mongo::cursor::find $mongoColl \ [list \$query document {age document {$gt int 30}}]] puts "Cursor: $cursor" set r0 [::mongo::cursor::next $cursor] set r1 [::mongo::cursor::next $cursor] set r2 [::mongo::cursor::next $cursor] ::mongo::cursor::close $cursor set _ [llength $r0]-[llength $r1]-[llength $r2] } 12-12-0 puts stderr "\nAge > 30 (all atts, via cursor interface, tailable)" ? { set cursor [::mongo::cursor::find $mongoColl \ [list \$query document {age document {$gt int 30}}] -tailable] if {$cursor ne ""} { set r "" while {1} { lappend r [::mongo::cursor::next $cursor] if {[lindex $r end] eq ""} break } ::mongo::cursor::close $cursor join [lmap x $r {llength $x}] - } } 12-12-0 puts stderr "\nEmpty result (via cursor interface)" ? { set cursor [::mongo::cursor::find $mongoColl \ [list \$query document {age document {$gt int 300}}]] if {$cursor ne ""} { set r {} while {1} { lappend r [::mongo::cursor::next $cursor] if {[lindex $r end] eq ""} break } ::mongo::cursor::close $cursor join [lmap x $r {llength $x}] - } } 0 puts stderr "\nArray 'a' contains 'x'" ? {llength [::mongo::collection::query $mongoColl \ [list \$query document {a string "x"}]]} 1 puts stderr "\nEmbedded document has some value (info.y > 100)" ? {llength [::mongo::collection::query $mongoColl \ [list \$query document {info.y document {$gt int 100}}]]} 1 puts stderr "\nProjects in {nsf gtat}" ? { llength [::mongo::collection::query $mongoColl \ [list \$query document {projects document {$in array {0 string nsf 1 string gtat}}}]]} 3 puts stderr "\nStatistics of $mongoColl" set stats [::mongo::collection::stats $mongoColl] ? {expr [llength $stats] % 3 == 0} 1 ? {expr [llength $stats] > 0} 1 if {[llength $stats] % 3 == 0} { puts [C bson pp $stats] } puts stderr "\nStatus" set status [::mongo::status $mongoConn] puts [C bson pp $status] ? {expr [llength $status] % 3 == 0} 1 ? {expr [llength $status] > 0} 1 puts stderr "\nClose connection $mongoConn" ::mongo::close $mongoConn # # Local variables: # mode: tcl # tcl-indent-level: 2 # indent-tabs-mode: nil # End: