+ (hash-table-fold
+ (get-table col)
+ (lambda (key document result)
+ (cond ((match-document? document filter)
+ (cons document result))
+ (else
+ result)))
+ '()))
+
+(define (match-document? document filter)
+ "Try to match the given document with a given filter"
+ (cond ((equal? filter #t)
+ #t)
+ (else
+ (filter document))))
+
+(define (update col filter . changes)
+ "Update selected documents using the given filter"
+ (let ((documents (find col filter)))
+ (apply insert (cons col (map (lambda (doc) (update-document doc changes)) documents)))))
+
+(define (update-document document changes)
+ "Update a document with the appropiate changes"
+ (cond ((null? changes)
+ document)
+ (else
+ (update-document ((car changes) document) (cdr changes)))))
+
+
+;;; Queries
+
+(define ($eq field value)
+ (lambda (document)
+ (let ((stored (assoc field document)))
+ (and stored
+ (equal? (cdr stored) value)))))