- (and
- (equal? (vhash-assoc (caar filter) document) (car filter))
- (match-document? document (cdr filter))))))
+ (filter document))))
+
+(define (update col filter . changes)
+ "Update selected documents using the given filter"
+ (let ((documents (inner-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 (vhash-assoc field document)))
+ (and stored
+ (equal? (cdr stored) value)))))
+
+(define ($exists field)
+ (lambda (document)
+ (and (vhash-assoc field document)
+ #t)))
+
+(define ($not expr)
+ (lambda (document)
+ (not (expr document))))
+
+(define-syntax $and
+ (syntax-rules ()
+ ((_ expr ...)
+ (lambda (document)
+ (and (expr document)
+ ...)))))
+
+
+;;; Updates