Compare commits
1 commit
master
...
3.1.x-stab
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ec1b4787d |
42 changed files with 396 additions and 666 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -12,5 +12,3 @@ todo.org
|
|||
.nrepl-*
|
||||
.idea/
|
||||
*.iml
|
||||
/.clj-kondo/.cache
|
||||
/.lsp/.cache
|
||||
|
|
|
|||
17
.travis.yml
17
.travis.yml
|
|
@ -1,20 +1,17 @@
|
|||
language: clojure
|
||||
sudo: required
|
||||
lein: lein
|
||||
dist: xenial
|
||||
lein: lein2
|
||||
before_script:
|
||||
# Give MongoDB server some time to boot
|
||||
- sleep 15
|
||||
- ./bin/ci/install_mongodb.sh
|
||||
- mongod --version
|
||||
- ./bin/ci/before_script.sh
|
||||
script: lein do clean, javac, test
|
||||
script: lein2 do clean, javac, test
|
||||
jdk:
|
||||
- openjdk10
|
||||
- oraclejdk11
|
||||
- openjdk12
|
||||
- openjdk7
|
||||
- oraclejdk7
|
||||
- oraclejdk8
|
||||
services:
|
||||
- mongodb
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- 3.5.x-stable
|
||||
- 3.0.x-stable
|
||||
|
|
|
|||
51
ChangeLog.md
51
ChangeLog.md
|
|
@ -1,53 +1,4 @@
|
|||
## Changes between 3.5.x and 3.6.0 (unreleased)
|
||||
|
||||
### UUID Representation Option
|
||||
|
||||
Added a new connection option, `:uuid-representation`.
|
||||
|
||||
Contributed by @okorz001.
|
||||
|
||||
GitHub issue: [#212](https://github.com/michaelklishin/monger/issues/212)
|
||||
|
||||
### Operator List Update
|
||||
|
||||
For MongoDB 4.x.
|
||||
|
||||
Contributed by @mjrb.
|
||||
|
||||
GitHub issue: [#196](https://github.com/michaelklishin/monger/pull/196)
|
||||
|
||||
### Dependency Update
|
||||
|
||||
Contributed by @robhanlon22.
|
||||
|
||||
GitHub issue: [#206](https://github.com/michaelklishin/monger/pull/206)
|
||||
|
||||
|
||||
## Changes between 3.1.x and 3.5.0 (Dec 10th, 2018)
|
||||
|
||||
### MongoDB Java Driver Update
|
||||
|
||||
MongoDB Java driver dependency has been updated to `3.9.x`.
|
||||
|
||||
This means that Monger now **requires JDK 8**.
|
||||
|
||||
Contributed by @Linicks.
|
||||
|
||||
### 3rd Party Library Compatibility
|
||||
|
||||
* Cheshire `5.8.x`
|
||||
* clj-time `0.15.1`
|
||||
* ring-core `0.15.1`
|
||||
* Ragtime `0.7.x`.
|
||||
|
||||
### URI Connection Usability Improvement
|
||||
|
||||
URIs that don't specify a database will now be rejected as invalid.
|
||||
|
||||
Contributed by Chris Broome.
|
||||
|
||||
|
||||
## Changes between 3.0.x and 3.1.0 (September 17th, 2016)
|
||||
## Changes between 3.0.x and 3.1.0
|
||||
|
||||
### MongoDB Java Driver Update
|
||||
|
||||
|
|
|
|||
34
README.md
34
README.md
|
|
@ -1,19 +1,14 @@
|
|||
# Monger, a modern Clojure MongoDB Driver
|
||||
[](https://travis-ci.org/xingzhefeng/monger)
|
||||
|
||||
Monger is an idiomatic [Clojure MongoDB driver](http://clojuremongodb.info) for a more civilized age.
|
||||
|
||||
It has batteries included, offers powerful expressive query DSL,
|
||||
strives to support modern MongoDB features and have the "look and feel" and
|
||||
flexibility of the MongoDB shell.
|
||||
|
||||
Monger is built from for modern Clojure versions and sits on top of
|
||||
the official MongoDB Java driver.
|
||||
It has batteries included, offers powerful expressive query DSL, strives to support every MongoDB 2.0+ feature and has sane defaults. Monger is built from for modern Clojure versions and sits on top of the official MongoDB Java driver.
|
||||
|
||||
|
||||
## Project Goals
|
||||
|
||||
There is one MongoDB client for Clojure that has been around since 2009. So, why create another one? Monger authors
|
||||
wanted a client that would
|
||||
wanted a client that will
|
||||
|
||||
* Support most of modern MongoDB features, focus on those that really matter.
|
||||
* Be [well documented](http://clojuremongodb.info).
|
||||
|
|
@ -29,7 +24,7 @@ wanted a client that would
|
|||
|
||||
## Project Maturity
|
||||
|
||||
Monger is not a young project: started in July 2011, it is over 7
|
||||
Monger is not a young project: started in July 2011, it is over 3
|
||||
years old with active production use from week 1.
|
||||
|
||||
|
||||
|
|
@ -50,14 +45,14 @@ Maven, add the following repository definition to your `pom.xml`:
|
|||
|
||||
With Leiningen:
|
||||
|
||||
[com.novemberain/monger "3.5.0"]
|
||||
[com.novemberain/monger "3.0.1"]
|
||||
|
||||
With Maven:
|
||||
|
||||
<dependency>
|
||||
<groupId>com.novemberain</groupId>
|
||||
<artifactId>monger</artifactId>
|
||||
<version>3.5.0</version>
|
||||
<version>3.0.1</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
|
|
@ -75,13 +70,15 @@ questions, too!
|
|||
|
||||
Please see our [documentation guides site](http://clojuremongodb.info/) and [API reference](http://reference.clojuremongodb.info).
|
||||
|
||||
Our [test suite](https://github.com/michaelklishin/monger/tree/master/test/monger/test)
|
||||
Our [test
|
||||
suite](https://github.com/michaelklishin/monger/tree/master/test/monger/test)
|
||||
also has many code examples.
|
||||
|
||||
|
||||
## Community
|
||||
|
||||
[Monger has a mailing list](https://groups.google.com/forum/#!forum/clojure-mongodb). Feel
|
||||
[Monger has a mailing
|
||||
list](https://groups.google.com/forum/#!forum/clojure-mongodb). Feel
|
||||
free to join it and ask any questions you may have.
|
||||
|
||||
To subscribe for announcements of releases, important changes and so
|
||||
|
|
@ -91,13 +88,14 @@ on Twitter.
|
|||
|
||||
## Supported Clojure versions
|
||||
|
||||
Monger requires Clojure 1.8+. The most recent
|
||||
Monger requires Clojure 1.6+. The most recent
|
||||
stable release is highly recommended.
|
||||
|
||||
|
||||
## Continuous Integration Status
|
||||
|
||||
[](http://travis-ci.org/michaelklishin/monger)
|
||||
[](http://jarkeeper.com/michaelklishin/monger)
|
||||
|
||||
|
||||
## Monger Is a ClojureWerkz Project
|
||||
|
|
@ -115,12 +113,6 @@ supported Clojure versions using
|
|||
./bin/ci/before_script.sh
|
||||
lein all do clean, javac, test
|
||||
|
||||
Or, if you don't have mongodb installed, you can use docker
|
||||
|
||||
docker-compose up
|
||||
./bin/ci/before_script_docker.sh
|
||||
lein all do clean, javac, test
|
||||
|
||||
Then create a branch and make your changes on it. Once you are done with your changes and all tests pass, submit a pull request
|
||||
on Github.
|
||||
|
||||
|
|
@ -128,7 +120,7 @@ on Github.
|
|||
|
||||
## License
|
||||
|
||||
Copyright (C) 2011-2018 [Michael S. Klishin](http://twitter.com/michaelklishin), Alex Petrov, and the ClojureWerkz team.
|
||||
Copyright (C) 2011-2016 [Michael S. Klishin](http://twitter.com/michaelklishin), Alex Petrov, and the ClojureWerkz team.
|
||||
|
||||
Double licensed under the [Eclipse Public License](http://www.eclipse.org/legal/epl-v10.html) (the same as Clojure) or
|
||||
the [Apache Public License 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
|
||||
|
|
|
|||
|
|
@ -1,18 +1,11 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Check which MongoDB shell is available
|
||||
if command -v mongosh >/dev/null 2>&1; then
|
||||
MONGO_SHELL="mongosh"
|
||||
elif command -v mongo >/dev/null 2>&1; then
|
||||
MONGO_SHELL="mongo"
|
||||
else
|
||||
echo "Error: Neither mongo nor mongosh shell found. Please install MongoDB shell."
|
||||
exit 1
|
||||
fi
|
||||
# MongoDB seems to need some time to boot first. MK.
|
||||
sleep 5
|
||||
|
||||
# MongoDB Java driver won't run authentication twice on the same DB instance,
|
||||
# so we need to use multiple DBs.
|
||||
$MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test
|
||||
$MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test2
|
||||
$MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test3
|
||||
$MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test4
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"]})' monger-test
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"]})' monger-test2
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"]})' monger-test3
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"]})' monger-test4
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Check which MongoDB shell is available in the container
|
||||
if docker exec mongo_test which mongosh >/dev/null 2>&1; then
|
||||
MONGO_SHELL="mongosh"
|
||||
elif docker exec mongo_test which mongo >/dev/null 2>&1; then
|
||||
MONGO_SHELL="mongo"
|
||||
else
|
||||
echo "Error: Neither mongo nor mongosh shell found in the container."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# MongoDB Java driver won't run authentication twice on the same DB instance,
|
||||
# so we need to use multiple DBs.
|
||||
docker exec mongo_test $MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test
|
||||
docker exec mongo_test $MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test2
|
||||
docker exec mongo_test $MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test3
|
||||
docker exec mongo_test $MONGO_SHELL --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], mechanisms: ["SCRAM-SHA-1"], passwordDigestor: "client"})' monger-test4
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# MongoDB seems to need some time to boot first. MK.
|
||||
sleep 5
|
||||
|
||||
# MongoDB Java driver won't run authentication twice on the same DB instance,
|
||||
# so we need to use multiple DBs.
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], passwordDigestor: "client"})' monger-test
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], passwordDigestor: "client"})' monger-test2
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], passwordDigestor: "client"})' monger-test3
|
||||
mongo --eval 'db.createUser({"user": "clojurewerkz/monger", "pwd": "monger", roles: ["dbAdmin"], passwordDigestor: "client"})' monger-test4
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
|
||||
|
||||
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
|
||||
echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org.list
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y mongodb-org
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
# Use root/example as user/password credentials
|
||||
version: '3.1'
|
||||
|
||||
services:
|
||||
|
||||
mongo:
|
||||
image: mongo
|
||||
container_name: mongo_test
|
||||
restart: always
|
||||
ports:
|
||||
- "27017:27017"
|
||||
45
project.clj
45
project.clj
|
|
@ -1,12 +1,12 @@
|
|||
(defproject com.novemberain/monger "4.0.0-SNAPSHOT"
|
||||
(defproject com.novemberain/monger "3.1.1-SNAPSHOT"
|
||||
:description "Monger is a Clojure MongoDB client for a more civilized age: friendly, flexible and with batteries included"
|
||||
:url "http://clojuremongodb.info"
|
||||
:min-lein-version "2.5.1"
|
||||
:license {:name "Eclipse Public License"
|
||||
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
||||
:dependencies [[org.clojure/clojure "1.11.1"]
|
||||
[org.mongodb/mongodb-driver "3.12.11"]
|
||||
[clojurewerkz/support "1.5.0"]]
|
||||
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||
[org.mongodb/mongodb-driver "3.3.0"]
|
||||
[clojurewerkz/support "1.1.0"]]
|
||||
:test-selectors {:default (fn [m]
|
||||
(and (not (:performance m))
|
||||
(not (:edge-features m))
|
||||
|
|
@ -27,32 +27,35 @@
|
|||
:all (constantly true)}
|
||||
:source-paths ["src/clojure"]
|
||||
:java-source-paths ["src/java"]
|
||||
:javac-options ["-target" "1.8" "-source" "1.8"]
|
||||
:javac-options ["-target" "1.6" "-source" "1.6"]
|
||||
:mailing-list {:name "clojure-mongodb"
|
||||
:archive "https://groups.google.com/group/clojure-mongodb"
|
||||
:post "clojure-mongodb@googlegroups.com"}
|
||||
:profiles {:1.10 {:dependencies [[org.clojure/clojure "1.10.2"]]}
|
||||
:1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]}
|
||||
:profiles {:dj02x {:dependencies [[org.clojure/data.json "0.2.6" :exclusions [org.clojure/clojure]]]}
|
||||
:1.6 {:dependencies [[org.clojure/clojure "1.6.0"]]}
|
||||
:1.7 {:dependencies [[org.clojure/clojure "1.7.0"]]}
|
||||
:1.9 {:dependencies [[org.clojure/clojure "1.9.0-alpha11"]]}
|
||||
:master {:dependencies [[org.clojure/clojure "1.9.0-master-SNAPSHOT"]]}
|
||||
:dev {:resource-paths ["test/resources"]
|
||||
:dependencies [[clj-time "0.15.1" :exclusions [org.clojure/clojure]]
|
||||
[cheshire "5.8.1" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/data.json "2.5.0" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/tools.cli "0.4.1" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/core.cache "0.7.1" :exclusions [org.clojure/clojure]]
|
||||
[ring/ring-core "1.7.1" :exclusions [org.clojure/clojure]]
|
||||
[com.novemberain/validateur "2.6.0" :exclusions [org.clojure/clojure]]
|
||||
[ch.qos.logback/logback-classic "1.2.3" :exclusions [org.slf4j/slf4j-api]]
|
||||
[ragtime/core "0.7.2" :exclusions [org.clojure/clojure]]]
|
||||
:plugins [[lein-codox "0.10.5"]]
|
||||
:dependencies [[clj-time "0.8.0" :exclusions [org.clojure/clojure]]
|
||||
[cheshire "5.5.0" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/data.json "0.2.5" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/tools.cli "0.3.1" :exclusions [org.clojure/clojure]]
|
||||
[org.clojure/core.cache "0.6.3" :exclusions [org.clojure/clojure]]
|
||||
[ring/ring-core "1.3.0" :exclusions [org.clojure/clojure]]
|
||||
[com.novemberain/validateur "2.4.2" :exclusions [org.clojure/clojure]]
|
||||
[ch.qos.logback/logback-classic "1.1.3" :exclusions [org.slf4j/slf4j-api]]
|
||||
[ragtime/ragtime.core "0.3.7" :exclusions [org.clojure/clojure]]]
|
||||
:plugins [[lein-codox "0.9.0"]]
|
||||
:codox {:source-paths ["src/clojure"]
|
||||
:namespaces [#"^monger\.(?!internal)"]}}
|
||||
;; only clj-time/JodaTime available, used to test monger.joda-time w/o clojure.data.json
|
||||
:dev2 {:resource-paths ["test/resources"]
|
||||
:dependencies [[clj-time "0.15.2" :exclusions [org.clojure/clojure]]]}}
|
||||
:aliases {"all" ["with-profile" "dev:dev,1.10:dev,1.9:dev"]}
|
||||
:repositories {"sonatype" {:url "https://oss.sonatype.org/content/repositories/releases"
|
||||
:dependencies [[clj-time "0.8.0" :exclusions [org.clojure/clojure]]]}}
|
||||
:aliases {"all" ["with-profile" "dev:dev,1.6:dev,1.8:dev,dj02x"]}
|
||||
:repositories {"sonatype" {:url "http://oss.sonatype.org/content/repositories/releases"
|
||||
:snapshots false
|
||||
:releases {:checksum :fail :update :always}}
|
||||
"sonatype-snapshots" {:url "https://oss.sonatype.org/content/repositories/snapshots"
|
||||
"sonatype-snapshots" {:url "http://oss.sonatype.org/content/repositories/snapshots"
|
||||
:snapshots true
|
||||
:releases {:checksum :fail :update :always}}})
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;; Copyright (c) 2012 Baishampayan Ghose
|
||||
;;
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;; Copyright (c) 2012 Baishampayan Ghose
|
||||
;;
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
* http://clojuremongodb.info/articles/updating.html
|
||||
* http://clojuremongodb.info/articles/deleting.html
|
||||
* http://clojuremongodb.info/articles/aggregation.html"
|
||||
(:refer-clojure :exclude [find remove count drop distinct empty? any? update])
|
||||
(:refer-clojure :exclude [find remove count drop distinct empty? update])
|
||||
(:import [com.mongodb Mongo DB DBCollection WriteResult DBObject WriteConcern
|
||||
DBCursor MapReduceCommand MapReduceCommand$OutputType AggregationOutput
|
||||
AggregationOptions AggregationOptions$OutputMode]
|
||||
|
|
@ -109,7 +109,7 @@
|
|||
|
||||
|
||||
(defn ^WriteResult insert-batch
|
||||
"Saves documents to collection. You can optionally specify WriteConcern as a third argument."
|
||||
"Saves documents do collection. You can optionally specify WriteConcern as a third argument."
|
||||
([^DB db ^String coll ^List documents]
|
||||
(.insert (.getCollection db (name coll))
|
||||
^List (to-db-object documents)
|
||||
|
|
@ -467,7 +467,7 @@
|
|||
|
||||
|
||||
(defn exists?
|
||||
"Checks whether collection with certain name exists."
|
||||
"Checks weather collection with certain name exists."
|
||||
([^DB db ^String coll]
|
||||
(.collectionExists db coll)))
|
||||
|
||||
|
|
@ -490,9 +490,9 @@
|
|||
(defn rename
|
||||
"Renames collection."
|
||||
([^DB db ^String from, ^String to]
|
||||
(.rename (.getCollection db (name from)) (name to)))
|
||||
(.rename (.getCollection db from) to))
|
||||
([^DB db ^String from ^String to drop-target?]
|
||||
(.rename (.getCollection db (name from)) (name to) drop-target?)))
|
||||
(.rename (.getCollection db from) to drop-target?)))
|
||||
|
||||
;;
|
||||
;; Map/Reduce
|
||||
|
|
@ -541,24 +541,20 @@
|
|||
is supported, for specifying a limit on the execution time of the query in
|
||||
milliseconds.
|
||||
|
||||
:keywordize option that control if resulting map keys will be turned into keywords, default is true.
|
||||
|
||||
See http://docs.mongodb.org/manual/applications/aggregation/ to learn more."
|
||||
[^DB db ^String coll stages & opts]
|
||||
(let [coll (.getCollection db (name coll))
|
||||
(let [coll (.getCollection db coll)
|
||||
agg-opts (build-aggregation-options opts)
|
||||
pipe (into-array-list (to-db-object stages))
|
||||
res (.aggregate coll pipe agg-opts)
|
||||
{:keys [^Boolean keywordize]
|
||||
:or {keywordize true}} opts]
|
||||
(map #(from-db-object % keywordize) (iterator-seq res))))
|
||||
res (.aggregate coll pipe agg-opts)]
|
||||
(map #(from-db-object % true) (iterator-seq res))))
|
||||
|
||||
(defn explain-aggregate
|
||||
"Returns the explain plan for an aggregation query. MongoDB 2.2+ only.
|
||||
|
||||
See http://docs.mongodb.org/manual/applications/aggregation/ to learn more."
|
||||
[^DB db ^String coll stages & opts]
|
||||
(let [coll (.getCollection db (name coll))
|
||||
(let [coll (.getCollection db coll)
|
||||
agg-opts (build-aggregation-options opts)
|
||||
pipe (into-array-list (to-db-object stages))
|
||||
res (.explainAggregate coll pipe agg-opts)]
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;; All rights reserved.
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Portions of the code are Copyright (c) 2009 Andrew Boekhoff
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Portions of the code are Copyright (c) 2009 Andrew Boekhoff
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -46,8 +46,7 @@
|
|||
(:import [com.mongodb DBObject BasicDBObject BasicDBList DBCursor]
|
||||
[clojure.lang IPersistentMap Named Keyword Ratio]
|
||||
[java.util List Map Date Set]
|
||||
org.bson.types.ObjectId
|
||||
(org.bson.types Decimal128)))
|
||||
org.bson.types.ObjectId))
|
||||
|
||||
(defprotocol ConvertToDBObject
|
||||
(^com.mongodb.DBObject to-db-object [input] "Converts given piece of Clojure data to BasicDBObject MongoDB Java driver uses"))
|
||||
|
|
@ -105,30 +104,27 @@
|
|||
|
||||
|
||||
|
||||
|
||||
(defprotocol ConvertFromDBObject
|
||||
(from-db-object [input keywordize] "Converts given DBObject instance to a piece of Clojure data"))
|
||||
|
||||
(extend-protocol ConvertFromDBObject
|
||||
nil
|
||||
(from-db-object [_ _] nil)
|
||||
(from-db-object [input keywordize] input)
|
||||
|
||||
Object
|
||||
(from-db-object [input _] input)
|
||||
|
||||
Decimal128
|
||||
(from-db-object [^Decimal128 input _]
|
||||
(.bigDecimalValue input))
|
||||
(from-db-object [input keywordize] input)
|
||||
|
||||
List
|
||||
(from-db-object [^List input keywordize]
|
||||
(mapv #(from-db-object % keywordize) input))
|
||||
(vec (map #(from-db-object % keywordize) input)))
|
||||
|
||||
BasicDBList
|
||||
(from-db-object [^BasicDBList input keywordize]
|
||||
(mapv #(from-db-object % keywordize) input))
|
||||
(vec (map #(from-db-object % keywordize) input)))
|
||||
|
||||
com.mongodb.DBRef
|
||||
(from-db-object [^com.mongodb.DBRef input _]
|
||||
(from-db-object [^com.mongodb.DBRef input keywordize]
|
||||
input)
|
||||
|
||||
DBObject
|
||||
|
|
@ -136,13 +132,13 @@
|
|||
;; DBObject provides .toMap, but the implementation in
|
||||
;; subclass GridFSFile unhelpfully throws
|
||||
;; UnsupportedOperationException.
|
||||
(persistent!
|
||||
(reduce (if keywordize
|
||||
(fn [m ^String k]
|
||||
(assoc! m (keyword k) (from-db-object (.get input k) true)))
|
||||
(assoc m (keyword k) (from-db-object (.get input k) true)))
|
||||
(fn [m ^String k]
|
||||
(assoc! m k (from-db-object (.get input k) false))))
|
||||
(transient {}) (.keySet input)))))
|
||||
(assoc m k (from-db-object (.get input k) false))))
|
||||
{} (.keySet input))))
|
||||
|
||||
|
||||
|
||||
(defprotocol ConvertToObjectId
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -71,7 +71,6 @@
|
|||
:port (27017 by default)"
|
||||
{:arglists '([]
|
||||
[server-address options]
|
||||
[server-address options credentials]
|
||||
[[server-address & more] options]
|
||||
[{:keys [host port uri] :or { host *mongodb-host* port *mongodb-port*}}])}
|
||||
([]
|
||||
|
|
@ -136,78 +135,56 @@
|
|||
(ServerAddress. hostname port)))
|
||||
|
||||
(defn ^MongoClientOptions$Builder mongo-options-builder
|
||||
[{:keys [add-cluster-listener add-cluster-listeners add-command-listener add-command-listeners
|
||||
add-connection-pool-listener add-connection-pool-listeners add-server-listener add-server-listeners
|
||||
add-server-monitor-listener add-server-monitor-listeners always-use-mbeans application-name
|
||||
codec-registry compressor-list connect-timeout connections-per-host cursor-finalizer-enabled
|
||||
db-decoder-factory db-encoder-factory description heartbeat-connect-timeout heartbeat-frequency
|
||||
heartbeat-socket-timeout local-threshold max-connection-idle-time max-connection-life-time
|
||||
max-wait-time min-connections-per-host min-heartbeat-frequency read-concern read-preference
|
||||
required-replica-set-name retry-writes server-selection-timeout server-selector socket-keep-alive
|
||||
socket-factory socket-timeout ssl-context ssl-enabled ssl-invalid-host-name-allowed
|
||||
threads-allowed-to-block-for-connection-multiplier uuid-representation write-concern]}]
|
||||
[{:keys [connections-per-host threads-allowed-to-block-for-connection-multiplier
|
||||
max-wait-time connect-timeout socket-timeout socket-keep-alive auto-connect-retry max-auto-connect-retry-time
|
||||
description write-concern cursor-finalizer-enabled read-preference required-replica-set-name
|
||||
add-command-listener always-use-mbeans codec-registry db-decoder-factory db-encoder-factory
|
||||
heartbeat-connect-timeout heartbeat-frequency heartbeat-socket-timeout local-threshold
|
||||
max-connection-idle-time max-connection-life-time min-connections-per-host min-heartbeat-frequency
|
||||
read-concern server-selection-timeout socket-factory ssl-enabled ssl-invalid-host-name-allowed]}]
|
||||
(let [mob (MongoClientOptions$Builder.)]
|
||||
(when add-cluster-listener
|
||||
(.addClusterListener mob add-cluster-listener))
|
||||
(when add-cluster-listeners
|
||||
(doseq [cluster-listener add-cluster-listeners]
|
||||
(.addClusterListener mob cluster-listener)))
|
||||
(when connections-per-host
|
||||
(.connectionsPerHost mob connections-per-host))
|
||||
(when threads-allowed-to-block-for-connection-multiplier
|
||||
(.threadsAllowedToBlockForConnectionMultiplier mob threads-allowed-to-block-for-connection-multiplier))
|
||||
(when max-wait-time
|
||||
(.maxWaitTime mob max-wait-time))
|
||||
(when connect-timeout
|
||||
(.connectTimeout mob connect-timeout))
|
||||
(when socket-timeout
|
||||
(.socketTimeout mob socket-timeout))
|
||||
(when socket-keep-alive
|
||||
(.socketKeepAlive mob socket-keep-alive))
|
||||
(when read-preference
|
||||
(.readPreference mob read-preference))
|
||||
(when description
|
||||
(.description mob description))
|
||||
(when write-concern
|
||||
(.writeConcern mob write-concern))
|
||||
(when cursor-finalizer-enabled
|
||||
(.cursorFinalizerEnabled mob cursor-finalizer-enabled))
|
||||
(when required-replica-set-name
|
||||
(.requiredReplicaSetName mob required-replica-set-name))
|
||||
(when add-command-listener
|
||||
(.addCommandListener mob add-command-listener))
|
||||
(when add-command-listeners
|
||||
(doseq [command-listener add-command-listeners]
|
||||
(.addCommandListener mob command-listener)))
|
||||
(when add-connection-pool-listener
|
||||
(.addConnectionPoolListener mob add-connection-pool-listener))
|
||||
(when add-connection-pool-listeners
|
||||
(doseq [connection-pool-listener add-connection-pool-listeners]
|
||||
(.addConnectionPoolListener mob connection-pool-listener)))
|
||||
(when add-server-listener
|
||||
(.addServerListener mob add-server-listener))
|
||||
(when add-server-listeners
|
||||
(doseq [server-listener add-server-listeners]
|
||||
(.addServerListener mob server-listener)))
|
||||
(when add-server-monitor-listener
|
||||
(.addServerMonitorListener mob add-server-monitor-listener))
|
||||
(when add-server-monitor-listeners
|
||||
(doseq [server-monitor-listener add-server-monitor-listeners]
|
||||
(.addServerMonitorListener mob server-monitor-listener)))
|
||||
(when always-use-mbeans
|
||||
(.alwaysUseMBeans mob always-use-mbeans))
|
||||
(when application-name
|
||||
(.applicationName mob application-name))
|
||||
(when always-use-mbeans
|
||||
(.alwaysUseMBeans mob always-use-mbeans))
|
||||
(when codec-registry
|
||||
(.codecRegistry mob codec-registry))
|
||||
(when compressor-list
|
||||
(.compressorList mob compressor-list))
|
||||
(when connections-per-host
|
||||
(.connectionsPerHost mob connections-per-host))
|
||||
(when connect-timeout
|
||||
(.connectTimeout mob connect-timeout))
|
||||
(when cursor-finalizer-enabled
|
||||
(.cursorFinalizerEnabled mob cursor-finalizer-enabled))
|
||||
(when db-decoder-factory
|
||||
(.dbDecoderFactory mob db-decoder-factory))
|
||||
(when db-encoder-factory
|
||||
(.dbEncoderFactory mob db-encoder-factory))
|
||||
(when description
|
||||
(.description mob description))
|
||||
(when heartbeat-connect-timeout
|
||||
(.heartbeatConnectTimeout mob heartbeat-connect-timeout))
|
||||
(when heartbeat-frequency
|
||||
(.heartbeatFrequency mob heartbeat-frequency))
|
||||
(when heartbeat-socket-timeout
|
||||
(.heartbeatSocketTimeout mob heartbeat-socket-timeout))
|
||||
(when ssl-context
|
||||
(.sslContext mob ssl-context))
|
||||
(when local-threshold
|
||||
(.localThreshold mob local-threshold))
|
||||
(when max-connection-idle-time
|
||||
(.maxConnectionIdleTime mob max-connection-idle-time))
|
||||
(when max-wait-time
|
||||
(.maxWaitTime mob max-wait-time))
|
||||
(when max-connection-life-time
|
||||
(.maxConnectionLifeTime mob max-connection-life-time))
|
||||
(when min-connections-per-host
|
||||
|
|
@ -216,32 +193,14 @@
|
|||
(.minHeartbeatFrequency mob min-heartbeat-frequency))
|
||||
(when read-concern
|
||||
(.readConcern mob read-concern))
|
||||
(when read-preference
|
||||
(.readPreference mob read-preference))
|
||||
(when required-replica-set-name
|
||||
(.requiredReplicaSetName mob required-replica-set-name))
|
||||
(when retry-writes
|
||||
(.retryWrites mob retry-writes))
|
||||
(when server-selection-timeout
|
||||
(.serverSelectionTimeout mob server-selection-timeout))
|
||||
(when server-selector
|
||||
(.serverSelector mob server-selector))
|
||||
(when socket-keep-alive
|
||||
(.socketKeepAlive mob socket-keep-alive))
|
||||
(when socket-factory
|
||||
(.socketFactory mob socket-factory))
|
||||
(when socket-timeout
|
||||
(.socketTimeout mob socket-timeout))
|
||||
(when ssl-enabled
|
||||
(.sslEnabled mob ssl-enabled))
|
||||
(when ssl-invalid-host-name-allowed
|
||||
(.sslInvalidHostNameAllowed mob ssl-invalid-host-name-allowed))
|
||||
(when threads-allowed-to-block-for-connection-multiplier
|
||||
(.threadsAllowedToBlockForConnectionMultiplier mob threads-allowed-to-block-for-connection-multiplier))
|
||||
(when uuid-representation
|
||||
(.uuidRepresentation mob uuid-representation))
|
||||
(when write-concern
|
||||
(.writeConcern mob write-concern))
|
||||
mob))
|
||||
|
||||
(defn ^MongoClientOptions mongo-options
|
||||
|
|
@ -274,10 +233,9 @@
|
|||
If username and password are provided, performs authentication."
|
||||
[^String uri-string]
|
||||
(let [uri (MongoClientURI. uri-string)
|
||||
conn (MongoClient. uri)]
|
||||
(if-let [dbName (.getDatabase uri)]
|
||||
{:conn conn :db (.getDB conn dbName)}
|
||||
(throw (IllegalArgumentException. "No database name specified in URI. Monger requires a database to be explicitly configured.")))))
|
||||
conn (MongoClient. uri)
|
||||
db (.getDB conn (.getDatabase uri))]
|
||||
{:conn conn :db db}))
|
||||
|
||||
(defn ^com.mongodb.CommandResult command
|
||||
"Runs a database command (please check MongoDB documentation for the complete list of commands).
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2012 Toby Hede
|
||||
;; All rights reserved.
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -114,30 +114,9 @@
|
|||
(to-input-stream [^InputStream input]
|
||||
input))
|
||||
|
||||
(defprotocol GridFSInputFileFactory
|
||||
(^GridFSInputFile create-gridfs-file [input ^GridFS fs] "Creates a file entry"))
|
||||
|
||||
(extend byte-array-type
|
||||
GridFSInputFileFactory
|
||||
{:create-gridfs-file (fn [^bytes input ^GridFS fs]
|
||||
(.createFile fs input))})
|
||||
|
||||
(extend-protocol GridFSInputFileFactory
|
||||
String
|
||||
(create-gridfs-file [^String input ^GridFS fs]
|
||||
(.createFile fs (io/file input)))
|
||||
|
||||
File
|
||||
(create-gridfs-file [^File input ^GridFS fs]
|
||||
(.createFile fs input))
|
||||
|
||||
InputStream
|
||||
(create-gridfs-file [^InputStream input ^GridFS fs]
|
||||
(.createFile fs input)))
|
||||
|
||||
(defn ^GridFSInputFile make-input-file
|
||||
[^GridFS fs input]
|
||||
(create-gridfs-file input fs))
|
||||
(.createFile fs (to-input-stream input)))
|
||||
|
||||
(defmacro store
|
||||
[^GridFSInputFile input & body]
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -70,19 +70,13 @@
|
|||
(try
|
||||
(extend-protocol clojure.data.json/JSONWriter
|
||||
ObjectId
|
||||
(-write
|
||||
([^ObjectId object out]
|
||||
(clojure.data.json/write (.toString object) out))
|
||||
([^ObjectId object out options]
|
||||
(clojure.data.json/write (.toString object) out options))))
|
||||
(-write [^ObjectId object out]
|
||||
(clojure.data.json/write (.toString object) out)))
|
||||
|
||||
(extend-protocol clojure.data.json/JSONWriter
|
||||
BSONTimestamp
|
||||
(-write
|
||||
([^BSONTimestamp object out]
|
||||
(clojure.data.json/write {:time (.getTime object) :inc (.getInc object)} out))
|
||||
([^BSONTimestamp object out options]
|
||||
(clojure.data.json/write {:time (.getTime object) :inc (.getInc object)} out options))))
|
||||
(-write [^BSONTimestamp object out]
|
||||
(clojure.data.json/write {:time (.getTime object) :inc (.getInc object)} out)))
|
||||
|
||||
(catch Throwable _
|
||||
false))
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -46,8 +46,6 @@
|
|||
;; QUERY OPERATORS
|
||||
;;
|
||||
|
||||
(declare $gt $gte $lt $lte $all $in $nin $eq $ne $elemMatch $regex $options)
|
||||
|
||||
;; $gt is "greater than" comparator
|
||||
;; $gte is "greater than or equals" comparator
|
||||
;; $gt is "less than" comparator
|
||||
|
|
@ -82,16 +80,10 @@
|
|||
;; (mgcol/find-maps "languages" { :tags { $nin [ "functional" ] } } )
|
||||
(defoperator $nin)
|
||||
|
||||
;; $eq is "equals" comparator
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;; (monger.collection/find "libraries" { :language { $eq "Clojure" }})
|
||||
(defoperator $eq)
|
||||
|
||||
;; $ne is "non-equals" comparator
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;; (monger.collection/find "libraries" { :language { $ne "Clojure" }})
|
||||
;; (monger.collection/find "libraries" {$ne { :language "Clojure" }})
|
||||
(defoperator $ne)
|
||||
|
||||
;; $elemMatch checks if an element in an array matches the specified expression
|
||||
|
|
@ -104,37 +96,6 @@
|
|||
(defoperator $regex)
|
||||
(defoperator $options)
|
||||
|
||||
;; comment on a query predicate
|
||||
|
||||
(declare $comment $explain $hint $maxTimeMS $orderBy $query $returnKey $showDiskLoc $natural)
|
||||
|
||||
(defoperator $comment)
|
||||
(defoperator $explain)
|
||||
(defoperator $hint)
|
||||
(defoperator $maxTimeMS)
|
||||
(defoperator $orderBy)
|
||||
(defoperator $query)
|
||||
(defoperator $returnKey)
|
||||
(defoperator $showDiskLoc)
|
||||
(defoperator $natural)
|
||||
|
||||
|
||||
;;
|
||||
;; EVALUATION (QUERY)
|
||||
;;
|
||||
|
||||
(declare $expr $jsonSchema $where $and $or $nor)
|
||||
|
||||
(defoperator $expr)
|
||||
(defoperator $jsonSchema)
|
||||
|
||||
;; Matches documents that satisfy a JavaScript expression.
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;;
|
||||
;; (monger.collection/find "people" { $where "this.placeOfBirth === this.address.city" })
|
||||
(defoperator $where)
|
||||
|
||||
;;
|
||||
;; LOGIC OPERATORS
|
||||
;;
|
||||
|
|
@ -167,8 +128,6 @@
|
|||
;; ATOMIC MODIFIERS
|
||||
;;
|
||||
|
||||
(declare $inc $mul $set $unset $setOnInsert $rename $push $position $each $addToSet $pop $pull $pullAll $bit $bitsAllClear $bitsAllSet $bitsAnyClear $bitsAnySet $exists $mod $size $type $not)
|
||||
|
||||
;; $inc increments one or many fields for the given value, otherwise sets the field to value
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
|
|
@ -212,9 +171,6 @@
|
|||
;; (mgcol/update "docs" { :_id oid } { $push { :tags "modifiers" } })
|
||||
(defoperator $push)
|
||||
|
||||
;; $position modifies the behavior of $push per https://docs.mongodb.com/manual/reference/operator/update/position/
|
||||
(defoperator $position)
|
||||
|
||||
;; $each is a modifier for the $push and $addToSet operators for appending multiple values to an array field.
|
||||
;; Without the $each modifier $push and $addToSet will append an array as a single value.
|
||||
;; MongoDB 2.4 adds support for the $each modifier to the $push operator.
|
||||
|
|
@ -224,6 +180,14 @@
|
|||
;; (mgcol/update coll { :_id oid } { $push { :tags { $each ["mongodb" "docs"] } } })
|
||||
(defoperator $each)
|
||||
|
||||
;; $pushAll appends each value in value_array to field, if field is an existing array, otherwise sets field to the array value_array
|
||||
;; if field is not present. If field is present but is not an array, an error condition is raised.
|
||||
;; Deprecated since MongoDB 2.4, $push with $each modifier should be used instead.
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;; (mgcol/update coll { :_id oid } { $pushAll { :tags ["mongodb" "docs"] } })
|
||||
(defoperator $pushAll)
|
||||
|
||||
;; $addToSet Adds value to the array only if its not in the array already, if field is an existing array, otherwise sets field to the
|
||||
;; array value if field is not present. If field is present but is not an array, an error condition is raised.
|
||||
;;
|
||||
|
|
@ -250,15 +214,11 @@
|
|||
;; an error condition is raised.
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;; (mgcol/update coll { :_id oid } { $pullAll { :measurements 1.2 } })
|
||||
;; (mgcol/update coll { :_id oid } { $pullAll { :measurements { $gte 1.2 } } })
|
||||
;; (mgcol/update coll { :_id oid } { $pull { :measurements 1.2 } })
|
||||
;; (mgcol/update coll { :_id oid } { $pull { :measurements { $gte 1.2 } } })
|
||||
(defoperator $pullAll)
|
||||
|
||||
(defoperator $bit)
|
||||
(defoperator $bitsAllClear)
|
||||
(defoperator $bitsAllSet)
|
||||
(defoperator $bitsAnyClear)
|
||||
(defoperator $bitsAnySet)
|
||||
|
||||
(defoperator $exists)
|
||||
(defoperator $mod)
|
||||
|
|
@ -268,132 +228,36 @@
|
|||
|
||||
|
||||
;;
|
||||
;; Aggregation in 4.2
|
||||
;; Aggregation in 2.2
|
||||
;;
|
||||
|
||||
(declare $addFields $bucket $bucketAuto $collStats $facet $geoNear $graphLookup $indexStats $listSessions $lookup $match $merge $out $planCacheStats $project $redact $replaceRoot $replaceWith $sample $limit $skip $unwind $group $sort $sortByCount $currentOp $listLocalSessions $cmp $min $max $avg $stdDevPop $stdDevSamp $sum $let $first $last $abs $add $ceil $divide $exp $floor $ln $log $log10 $multiply $pow $round $sqrt $subtract $trunc $literal $arrayElemAt $arrayToObject $concatArrays $filter $indexOfArray $isArray $map $objectToArray $range $reduce $reverseArray $zip $mergeObjects $allElementsTrue $anyElementsTrue $setDifference $setEquals $setIntersection $setIsSubset $setUnion $strcasecmp $substr $substrBytes $substrCP $toLower $toString $toUpper $concat $indexOfBytes $indexOfCP $ltrim $regexFind $regexFindAll $regexMatch $rtrim $split $strLenBytes $subLenCP $trim $sin $cos $tan $asin $acos $atan $atan2 $asinh $acosh $atanh $radiansToDegrees $degreesToRadians $convert $toBool $toDecimal $toDouble $toInt $toLong $toObjectId $dayOfMonth $dayOfWeek $dayOfYear $hour $minute $month $second $millisecond $week $year $isoDate $dateFromParts $dateFromString $dateToParts $dateToString $isoDayOfWeek $isoWeek $isoWeekYear $toDate $ifNull $cond $switch)
|
||||
|
||||
(defoperator $addFields)
|
||||
(defoperator $bucket)
|
||||
(defoperator $bucketAuto)
|
||||
(defoperator $collStats)
|
||||
(defoperator $facet)
|
||||
(defoperator $geoNear)
|
||||
(defoperator $graphLookup)
|
||||
(defoperator $indexStats)
|
||||
(defoperator $listSessions)
|
||||
(defoperator $lookup)
|
||||
(defoperator $match)
|
||||
(defoperator $merge)
|
||||
(defoperator $out)
|
||||
(defoperator $planCacheStats)
|
||||
(defoperator $project)
|
||||
(defoperator $redact)
|
||||
(defoperator $replaceRoot)
|
||||
(defoperator $replaceWith)
|
||||
(defoperator $sample)
|
||||
(defoperator $limit)
|
||||
(defoperator $skip)
|
||||
(defoperator $unwind)
|
||||
(defoperator $group)
|
||||
(defoperator $sort)
|
||||
(defoperator $sortByCount)
|
||||
|
||||
(defoperator $currentOp)
|
||||
(defoperator $listLocalSessions)
|
||||
|
||||
(defoperator $cmp)
|
||||
|
||||
(defoperator $min)
|
||||
(defoperator $max)
|
||||
(defoperator $avg)
|
||||
(defoperator $stdDevPop)
|
||||
(defoperator $stdDevSamp)
|
||||
(defoperator $sum)
|
||||
(defoperator $let)
|
||||
|
||||
(defoperator $first)
|
||||
(defoperator $last)
|
||||
|
||||
(defoperator $abs)
|
||||
(defoperator $add)
|
||||
(defoperator $ceil)
|
||||
(defoperator $divide)
|
||||
(defoperator $exp)
|
||||
(defoperator $floor)
|
||||
(defoperator $ln)
|
||||
(defoperator $log)
|
||||
(defoperator $log10)
|
||||
(defoperator $multiply)
|
||||
(defoperator $pow)
|
||||
(defoperator $round)
|
||||
(defoperator $sqrt)
|
||||
(defoperator $subtract)
|
||||
(defoperator $trunc)
|
||||
(defoperator $literal)
|
||||
|
||||
(defoperator $arrayElemAt)
|
||||
(defoperator $arrayToObject)
|
||||
(defoperator $concatArrays)
|
||||
(defoperator $filter)
|
||||
(defoperator $indexOfArray)
|
||||
(defoperator $isArray)
|
||||
(defoperator $map)
|
||||
(defoperator $objectToArray)
|
||||
(defoperator $range)
|
||||
(defoperator $reduce)
|
||||
(defoperator $reverseArray)
|
||||
(defoperator $zip)
|
||||
(defoperator $mergeObjects)
|
||||
|
||||
(defoperator $allElementsTrue)
|
||||
(defoperator $anyElementsTrue)
|
||||
(defoperator $setDifference)
|
||||
(defoperator $setEquals)
|
||||
(defoperator $setIntersection)
|
||||
(defoperator $setIsSubset)
|
||||
(defoperator $setUnion)
|
||||
(defoperator $substract)
|
||||
|
||||
(defoperator $strcasecmp)
|
||||
(defoperator $substr)
|
||||
(defoperator $substrBytes)
|
||||
(defoperator $substrCP)
|
||||
(defoperator $toLower)
|
||||
(defoperator $toString)
|
||||
(defoperator $toUpper)
|
||||
(defoperator $concat)
|
||||
(defoperator $indexOfBytes)
|
||||
(defoperator $indexOfCP)
|
||||
(defoperator $ltrim)
|
||||
(defoperator $regexFind)
|
||||
(defoperator $regexFindAll)
|
||||
(defoperator $regexMatch)
|
||||
(defoperator $rtrim)
|
||||
(defoperator $split)
|
||||
(defoperator $strLenBytes)
|
||||
(defoperator $subLenCP)
|
||||
(defoperator $trim)
|
||||
|
||||
(defoperator $sin)
|
||||
(defoperator $cos)
|
||||
(defoperator $tan)
|
||||
(defoperator $asin)
|
||||
(defoperator $acos)
|
||||
(defoperator $atan)
|
||||
(defoperator $atan2)
|
||||
(defoperator $asinh)
|
||||
(defoperator $acosh)
|
||||
(defoperator $atanh)
|
||||
(defoperator $radiansToDegrees)
|
||||
(defoperator $degreesToRadians)
|
||||
|
||||
(defoperator $convert)
|
||||
(defoperator $toBool)
|
||||
(defoperator $toDecimal)
|
||||
(defoperator $toDouble)
|
||||
(defoperator $toInt)
|
||||
(defoperator $toLong)
|
||||
(defoperator $toObjectId)
|
||||
|
||||
(defoperator $dayOfMonth)
|
||||
(defoperator $dayOfWeek)
|
||||
|
|
@ -406,40 +270,19 @@
|
|||
(defoperator $week)
|
||||
(defoperator $year)
|
||||
(defoperator $isoDate)
|
||||
(defoperator $dateFromParts)
|
||||
(defoperator $dateFromString)
|
||||
(defoperator $dateToParts)
|
||||
(defoperator $dateToString)
|
||||
(defoperator $isoDayOfWeek)
|
||||
(defoperator $isoWeek)
|
||||
(defoperator $isoWeekYear)
|
||||
(defoperator $toDate)
|
||||
|
||||
|
||||
(defoperator $ifNull)
|
||||
(defoperator $cond)
|
||||
(defoperator $switch)
|
||||
|
||||
;; Geospatial
|
||||
(declare $geoWithin $geoIntersects $near $nearSphere $geometry $maxDistance $minDistance $center $centerSphere $box $polygon $slice)
|
||||
(defoperator $geoWithin)
|
||||
(defoperator $geoIntersects)
|
||||
(defoperator $near)
|
||||
(defoperator $nearSphere)
|
||||
(defoperator $geometry)
|
||||
(defoperator $maxDistance)
|
||||
(defoperator $minDistance)
|
||||
(defoperator $center)
|
||||
(defoperator $centerSphere)
|
||||
(defoperator $box)
|
||||
(defoperator $polygon)
|
||||
|
||||
(defoperator $slice)
|
||||
|
||||
;; full text search
|
||||
(declare $text $meta $search $language $natural $currentDate $isolated $count)
|
||||
(defoperator $text)
|
||||
(defoperator $meta)
|
||||
(defoperator $search)
|
||||
(defoperator $language)
|
||||
(defoperator $natural)
|
||||
|
|
@ -449,11 +292,3 @@
|
|||
;; EXAMPLES:
|
||||
;; (mgcol/update coll { :_id oid } { $currentDate { :lastModified true } })
|
||||
(defoperator $currentDate)
|
||||
|
||||
;; Isolates intermediate multi-document updates from other clients.
|
||||
;;
|
||||
;; EXAMPLES:
|
||||
;; (mgcol/update "libraries" { :language "Clojure", $isolated 1 } { $inc { :popularity 1 } } {:multi true})
|
||||
(defoperator $isolated)
|
||||
|
||||
(defoperator $count)
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -43,7 +43,6 @@
|
|||
[monger.conversion :refer :all]
|
||||
[monger.operators :refer :all])
|
||||
(:import [com.mongodb DB DBCollection DBObject DBCursor ReadPreference]
|
||||
[java.util.concurrent TimeUnit]
|
||||
java.util.List))
|
||||
|
||||
|
||||
|
|
@ -97,7 +96,6 @@
|
|||
snapshot
|
||||
read-preference
|
||||
keywordize-fields
|
||||
max-time
|
||||
options]
|
||||
:or { limit 0 batch-size 256 skip 0 } }]
|
||||
(with-open [cursor (doto (.find collection (to-db-object query) (as-field-selector fields))
|
||||
|
|
@ -111,8 +109,6 @@
|
|||
(.hint cursor (to-db-object hint)))
|
||||
(when read-preference
|
||||
(.setReadPreference cursor read-preference))
|
||||
(when max-time
|
||||
(.maxTime cursor max-time TimeUnit/MILLISECONDS))
|
||||
(when options
|
||||
(add-options cursor options))
|
||||
(map (fn [x] (from-db-object x keywordize-fields))
|
||||
|
|
@ -158,10 +154,6 @@
|
|||
[m ^ReadPreference rp]
|
||||
(merge m { :read-preference rp }))
|
||||
|
||||
(defn max-time
|
||||
[m ^long max-time]
|
||||
(merge m { :max-time max-time }))
|
||||
|
||||
(defn options
|
||||
[m opts]
|
||||
(merge m { :options opts }))
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
(ns monger.ragtime
|
||||
"Ragtime integration"
|
||||
(:refer-clojure :exclude [find sort])
|
||||
(:require [ragtime.protocols :as proto]
|
||||
(:require [ragtime.core :as ragtime]
|
||||
[monger.core :as mg]
|
||||
[monger.collection :as mc]
|
||||
[monger.query :refer [with-collection find sort]])
|
||||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
|
||||
(extend-type com.mongodb.DB
|
||||
proto/DataStore
|
||||
ragtime/Migratable
|
||||
(add-migration-id [db id]
|
||||
(mc/insert db migrations-collection {:_id id :created_at (Date.)} WriteConcern/FSYNC_SAFE))
|
||||
(remove-migration-id [db id]
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -65,8 +65,3 @@
|
|||
(acknowledged?
|
||||
[^CommandResult result]
|
||||
(.ok result)))
|
||||
|
||||
(defn affected-count
|
||||
"Get the number of documents affected"
|
||||
[^WriteResult result]
|
||||
(.getN result))
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
;; The APL v2.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team
|
||||
;;
|
||||
;; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
;; you may not use this file except in compliance with the License.
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
;; The EPL v1.0:
|
||||
;;
|
||||
;; ----------------------------------------------------------------------------------
|
||||
;; Copyright (c) 2011-2018 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; Copyright (c) 2011-2015 Michael S. Klishin, Alex Petrov, and the ClojureWerkz Team.
|
||||
;; All rights reserved.
|
||||
;;
|
||||
;; This program and the accompanying materials are made available under the terms of
|
||||
|
|
@ -32,14 +32,12 @@
|
|||
;; ----------------------------------------------------------------------------------
|
||||
|
||||
(ns ^{:doc "Provides various utility functions, primarily for working with document ids."} monger.util
|
||||
(:refer-clojure :exclude [random-uuid])
|
||||
(:import java.security.SecureRandom
|
||||
java.math.BigInteger
|
||||
org.bson.types.ObjectId
|
||||
com.mongodb.DBObject
|
||||
clojure.lang.IPersistentMap
|
||||
java.util.Map)
|
||||
(:refer-clojure :exclude [random-uuid]))
|
||||
java.util.Map))
|
||||
|
||||
;;
|
||||
;; API
|
||||
|
|
|
|||
|
|
@ -15,27 +15,6 @@
|
|||
|
||||
(use-fixtures :each purge-collections)
|
||||
|
||||
(deftest test-basic-single-stage-$project-aggregation-no-keywordize
|
||||
(let [batch [{"state" "CA" "quantity" 1 "price" 199.00}
|
||||
{"state" "NY" "quantity" 2 "price" 199.00}
|
||||
{"state" "NY" "quantity" 1 "price" 299.00}
|
||||
{"state" "IL" "quantity" 2 "price" 11.50 }
|
||||
{"state" "CA" "quantity" 2 "price" 2.95 }
|
||||
{"state" "IL" "quantity" 3 "price" 5.50 }]
|
||||
expected #{{"quantity" 1 "state" "CA"}
|
||||
{"quantity" 2 "state" "NY"}
|
||||
{"quantity" 1 "state" "NY"}
|
||||
{"quantity" 2 "state" "IL"}
|
||||
{"quantity" 2 "state" "CA"}
|
||||
{"quantity" 3 "state" "IL"}}]
|
||||
(mc/insert-batch db coll batch)
|
||||
(is (= 6 (mc/count db coll)))
|
||||
(let [result (->>
|
||||
(mc/aggregate db coll [{$project {"state" 1 "quantity" 1}}] :keywordize false)
|
||||
(map #(select-keys % ["state" "quantity"]))
|
||||
(set))]
|
||||
(is (= expected result)))))
|
||||
|
||||
(deftest test-basic-single-stage-$project-aggregation
|
||||
(let [batch [{:state "CA" :quantity 1 :price 199.00}
|
||||
{:state "NY" :quantity 2 :price 199.00}
|
||||
|
|
@ -130,7 +109,9 @@
|
|||
(deftest test-explain-aggregate
|
||||
(let [batch [{:state "CA" :price 100}
|
||||
{:state "CA" :price 10}
|
||||
{:state "IL" :price 50}]]
|
||||
{:state "IL" :price 50}]
|
||||
expected-keys #{:ok :stages}]
|
||||
(mc/insert-batch db coll batch)
|
||||
(let [result (mc/explain-aggregate db coll [{$match {:state "CA"}}])]
|
||||
(is (:ok result))))))
|
||||
(let [result (mc/explain-aggregate db coll [{$match {:state "CA"}}])
|
||||
key-in-result? (partial contains? result)]
|
||||
(is (every? key-in-result? expected-keys))))))
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@
|
|||
|
||||
|
||||
;; this is a common mistake, I leave it here to demonstrate it. You almost never
|
||||
;; actually want to do this! What you really want is to use $push with $each instead of $push. MK.
|
||||
;; actually want to do this! What you really want is to use $pushAll instead of $push. MK.
|
||||
(deftest add-array-value-to-an-existing-array-using-$push-modifier
|
||||
(let [coll "docs"
|
||||
oid (ObjectId.)
|
||||
|
|
@ -228,34 +228,34 @@
|
|||
(mc/find-map-by-id db coll oid)))))
|
||||
|
||||
;;
|
||||
;; $push + $each (formerly $pushAll)
|
||||
;; $pushAll
|
||||
;;
|
||||
|
||||
(deftest initialize-an-array-using-$push-and-$each-modifiers
|
||||
(deftest initialize-an-array-using-$pushAll-modifier
|
||||
(let [coll "docs"
|
||||
oid (ObjectId.)
|
||||
title "$pushAll modifier appends multiple values to field"]
|
||||
(mc/insert db coll {:_id oid :title title})
|
||||
(mc/update db coll {:_id oid} {$push {:tags {$each ["mongodb" "docs"]}}})
|
||||
(mc/update db coll {:_id oid} {$pushAll {:tags ["mongodb" "docs"]}})
|
||||
(is (= {:_id oid :title title :tags ["mongodb" "docs"]}
|
||||
(mc/find-map-by-id db coll oid)))))
|
||||
|
||||
(deftest add-value-to-an-existing-array-using-$push-and-$each-modifier
|
||||
(deftest add-value-to-an-existing-array-using-$pushAll-modifier
|
||||
(let [coll "docs"
|
||||
oid (ObjectId.)
|
||||
title "$pushAll modifier appends multiple values to field"]
|
||||
(mc/insert db coll {:_id oid :title title :tags ["mongodb"]})
|
||||
(mc/update db coll {:_id oid} {$push {:tags {$each ["modifiers" "docs"]}}})
|
||||
(mc/update db coll {:_id oid} {$pushAll {:tags ["modifiers" "docs"]}})
|
||||
(is (= {:_id oid :title title :tags ["mongodb" "modifiers" "docs"]}
|
||||
(mc/find-map-by-id db coll oid)))))
|
||||
|
||||
|
||||
(deftest double-add-value-to-an-existing-array-using-$push-and-$each-modifier
|
||||
(deftest double-add-value-to-an-existing-array-using-$pushAll-modifier
|
||||
(let [coll "docs"
|
||||
oid (ObjectId.)
|
||||
title "$pushAll modifier appends multiple values to field"]
|
||||
(mc/insert db coll {:_id oid :title title :tags ["mongodb" "docs"]})
|
||||
(mc/update db coll {:_id oid} {$push {:tags {$each ["modifiers" "docs"]}}})
|
||||
(mc/update db coll {:_id oid} {$pushAll {:tags ["modifiers" "docs"]}})
|
||||
(is (= {:_id oid :title title :tags ["mongodb" "docs" "modifiers" "docs"]}
|
||||
(mc/find-map-by-id db coll oid)))))
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
(is (-> conn .getAddress (.sameHost "127.0.0.1")))))
|
||||
|
||||
(deftest ^{:authentication true} connect-to-mongo-via-uri-with-valid-credentials
|
||||
(let [{:keys [conn db]} (mg/connect-via-uri "mongodb://clojurewerkz%2Fmonger:monger@127.0.0.1/monger-test4")]
|
||||
(let [{:keys [conn db]} (mg/connect-via-uri "mongodb://clojurewerkz/monger:monger@127.0.0.1/monger-test4")]
|
||||
(is (= "monger-test4" (.getName db)))
|
||||
(is (-> conn .getAddress (.sameHost "127.0.0.1")))
|
||||
(mc/remove db "documents")
|
||||
|
|
|
|||
126
test/monger/test/cache_test.clj
Normal file
126
test/monger/test/cache_test.clj
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
(ns monger.test.cache-test
|
||||
(:require [monger.core :as mg]
|
||||
[monger.collection :as mc]
|
||||
[clojure.core.cache :refer :all]
|
||||
[clojure.test :refer :all]
|
||||
[monger.cache :refer :all])
|
||||
(:import [clojure.core.cache BasicCache FIFOCache LRUCache TTLCache]
|
||||
java.util.UUID))
|
||||
|
||||
;;
|
||||
;; Playground/Tests. These were necessary because clojure.core.cache has
|
||||
;; little documentation, incomplete test suite and
|
||||
;; slightly non-standard (although necessary to support all those cache variations)
|
||||
;; cache operations protocol.
|
||||
;;
|
||||
;; This is by no means clear or complete either but it did the job of helping me
|
||||
;; explore the API.
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-has?-with-basic-cache
|
||||
(testing "that has? returns false for misses"
|
||||
(let [c (BasicCache. {})]
|
||||
(are [v] (is (false? (has? c v)))
|
||||
:missing-key
|
||||
"missing-key"
|
||||
(gensym "missing-key"))))
|
||||
(testing "that has? returns true for hits"
|
||||
(let [c (BasicCache. {:skey "Value" :lkey (Long/valueOf 10000) "kkey" :keyword})]
|
||||
(are [v] (is (has? c v))
|
||||
:skey
|
||||
:lkey
|
||||
"kkey"))))
|
||||
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-lookup-with-basic-cache
|
||||
(testing "that lookup returns nil for misses"
|
||||
(let [c (BasicCache. {})]
|
||||
(are [v] (is (nil? (lookup c v)))
|
||||
:missing-key
|
||||
"missing-key"
|
||||
(gensym "missing-key"))))
|
||||
(testing "that lookup returns cached values for hits"
|
||||
(let [l (Long/valueOf 10000)
|
||||
c (BasicCache. {:skey "Value" :lkey l "kkey" :keyword})]
|
||||
(are [v k] (is (= v (lookup c k)))
|
||||
"Value" :skey
|
||||
l :lkey
|
||||
:keyword "kkey"))))
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-evict-with-basic-cache
|
||||
(testing "that evict has no effect for keys that do not exist"
|
||||
(let [c (atom (BasicCache. {:a 1 :b 2}))]
|
||||
(swap! c evict :missing-key)
|
||||
(is (has? @c :a))
|
||||
(is (has? @c :b))))
|
||||
(testing "that evict removes keys that did exist"
|
||||
(let [c (atom (BasicCache. {:skey "Value" "kkey" :keyword}))]
|
||||
(is (has? @c :skey))
|
||||
(is (= "Value" (lookup @c :skey)))
|
||||
(swap! c evict :skey)
|
||||
(is (not (has? @c :skey)))
|
||||
(is (= nil (lookup @c :skey)))
|
||||
(is (has? @c "kkey"))
|
||||
(is (= :keyword (lookup @c "kkey"))))))
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-seed-with-basic-cache
|
||||
(testing "that seed returns a new value"
|
||||
(let [c (atom (BasicCache. {}))]
|
||||
(swap! c seed {:a 1 :b "b" "c" :d})
|
||||
(are [k v] (do
|
||||
(is (has? @c k))
|
||||
(is (= v (lookup @c k))))
|
||||
:a 1
|
||||
:b "b"
|
||||
"c" :d))))
|
||||
|
||||
|
||||
;;
|
||||
;; Tests
|
||||
;;
|
||||
|
||||
(let [conn (mg/connect)
|
||||
db (mg/get-db conn "monger-test")]
|
||||
(use-fixtures :each (fn [f]
|
||||
(mc/remove db "basic_monger_cache_entries")
|
||||
(f)
|
||||
(mc/remove db "basic_monger_cache_entries")))
|
||||
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-has?-with-basic-monger-cache
|
||||
(testing "that has? returns false for misses"
|
||||
(let [coll "basic_monger_cache_entries"
|
||||
c (basic-monger-cache-factory db coll)]
|
||||
(is (not (has? c (str (UUID/randomUUID)))))
|
||||
(is (not (has? c (str (UUID/randomUUID)))))))
|
||||
(testing "that has? returns true for hits"
|
||||
(let [coll "basic_monger_cache_entries"
|
||||
c (basic-monger-cache-factory db coll {"a" 1 "b" "cache" "c" 3/4})]
|
||||
(is (has? c "a"))
|
||||
(is (has? c "b"))
|
||||
(is (has? c "c"))
|
||||
(is (not (has? c "d"))))))
|
||||
|
||||
|
||||
(deftest ^{:cache true}
|
||||
test-lookup-with-basic-monger-cache
|
||||
(testing "that lookup returns nil for misses"
|
||||
(let [coll "basic_monger_cache_entries"
|
||||
c (basic-monger-cache-factory db coll)]
|
||||
(are [v] (is (nil? (lookup c v)))
|
||||
:missing-key
|
||||
"missing-key"
|
||||
(gensym "missing-key"))))
|
||||
(testing "that lookup returns cached values for hits"
|
||||
(let [l (Long/valueOf 10000)
|
||||
coll "basic_monger_cache_entries"
|
||||
c (basic-monger-cache-factory db coll {:skey "Value" :lkey l "kkey" :keyword})]
|
||||
(are [v k] (is (= v (lookup c k)))
|
||||
"Value" :skey
|
||||
l :lkey
|
||||
"keyword" "kkey")))))
|
||||
|
||||
|
|
@ -134,7 +134,6 @@
|
|||
{:state "CA" :quantity 2 :price 2.95 }
|
||||
{:state "IL" :quantity 3 :price 5.50 }]]
|
||||
(mc/insert-batch db collection batch)
|
||||
(is (= ["CA" "IL" "NY"] (sort (mc/distinct db collection :state))))
|
||||
(is (= ["CA" "IL" "NY"] (sort (mc/distinct db collection :state {}))))
|
||||
(is (= ["CA" "NY"] (sort (mc/distinct db collection :state {:price {$gt 100.00}}))))))
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@
|
|||
[monger.conversion :refer :all])
|
||||
(:import [com.mongodb DBObject BasicDBObject BasicDBList]
|
||||
[java.util Date Calendar List ArrayList]
|
||||
org.bson.types.ObjectId
|
||||
(org.bson.types Decimal128)))
|
||||
org.bson.types.ObjectId))
|
||||
|
||||
|
||||
;;
|
||||
|
|
@ -102,13 +101,6 @@
|
|||
(is (= 2 (from-db-object 2 false)))
|
||||
(is (= 2 (from-db-object 2 true))))
|
||||
|
||||
(deftest convert-decimal-from-dbobject
|
||||
(is (= 2.3M (from-db-object (Decimal128. 2.3M) false)))
|
||||
(is (= 2.3M (from-db-object (Decimal128. 2.3M) true)))
|
||||
(is (= 2.3M (from-db-object (Decimal128/parse "2.3") true)))
|
||||
(is (not= 2.32M (from-db-object (Decimal128/parse "2.3") true)))
|
||||
)
|
||||
|
||||
(deftest convert-float-from-dbobject
|
||||
(is (= 3.3 (from-db-object 3.3 false)))
|
||||
(is (= 3.3 (from-db-object 3.3 true))))
|
||||
|
|
|
|||
|
|
@ -57,33 +57,16 @@
|
|||
(is (dbs "monger-test"))))
|
||||
|
||||
(deftest monger-options-test
|
||||
(let [opts {:always-use-mbeans true
|
||||
:application-name "app"
|
||||
:connect-timeout 1
|
||||
:connections-per-host 1
|
||||
:cursor-finalizer-enabled true
|
||||
:description "Description"
|
||||
:heartbeat-connect-timeout 1
|
||||
:heartbeat-frequency 1
|
||||
:heartbeat-socket-timeout 1
|
||||
:local-threshold 1
|
||||
:max-connection-idle-time 1
|
||||
:max-connection-life-time 1
|
||||
:max-wait-time 1
|
||||
:min-connections-per-host 1
|
||||
:min-heartbeat-frequency 1
|
||||
:required-replica-set-name "rs"
|
||||
:retry-writes true
|
||||
:server-selection-timeout 1
|
||||
:socket-keep-alive true
|
||||
:socket-timeout 1
|
||||
:ssl-enabled true
|
||||
:ssl-invalid-host-name-allowed true
|
||||
(let [opts {:connections-per-host 1
|
||||
:threads-allowed-to-block-for-connection-multiplier 1
|
||||
:uuid-representation org.bson.UuidRepresentation/STANDARD
|
||||
:write-concern com.mongodb.WriteConcern/JOURNAL_SAFE}]
|
||||
:max-wait-time 1
|
||||
:connect-timeout 1
|
||||
:socket-timeout 1
|
||||
:socket-keep-alive true
|
||||
:auto-connect-retry true
|
||||
:max-auto-connect-retry-time 1
|
||||
:description "Description"
|
||||
:write-concern com.mongodb.WriteConcern/JOURNAL_SAFE
|
||||
:cursor-finalizer-enabled true
|
||||
:required-replica-set-name "rs"}]
|
||||
(is (instance? com.mongodb.MongoClientOptions$Builder (mg/mongo-options-builder opts)))))
|
||||
|
||||
(deftest connect-to-uri-without-db-name
|
||||
(let [uri "mongodb://localhost:27017"]
|
||||
(is (thrown? IllegalArgumentException (mg/connect-via-uri uri)))))
|
||||
|
|
|
|||
|
|
@ -78,16 +78,6 @@
|
|||
(content-type "application/octet-stream"))
|
||||
(is (= 1 (count (gridfs/all-files fs))))))
|
||||
|
||||
(deftest ^{:gridfs true} test-deleting-file-instance-on-disk-after-storing
|
||||
(let [tmp-file (File/createTempFile "monger.test.gridfs" "test-deleting-file-instance-on-disk-after-storing")
|
||||
_ (spit tmp-file "to be deleted")]
|
||||
(is (= 0 (count (gridfs/all-files fs))))
|
||||
(store-file (make-input-file fs tmp-file)
|
||||
(filename "test-deleting-file-instance-on-disk-after-storing")
|
||||
(content-type "application/octet-stream"))
|
||||
(is (= 1 (count (gridfs/all-files fs))))
|
||||
(is (.delete tmp-file))))
|
||||
|
||||
|
||||
|
||||
(deftest ^{:gridfs true} test-finding-individual-files-on-gridfs
|
||||
|
|
|
|||
62
test/monger/test/map_reduce_test.clj
Normal file
62
test/monger/test/map_reduce_test.clj
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
(ns monger.test.map-reduce-test
|
||||
(:import [com.mongodb WriteResult WriteConcern DBCursor DBObject MapReduceOutput MapReduceCommand MapReduceCommand$OutputType]
|
||||
org.bson.types.ObjectId
|
||||
java.util.Date)
|
||||
(:require [monger.collection :as mc]
|
||||
[monger.core :as mg]
|
||||
[clojurewerkz.support.js :as js]
|
||||
[clojure.test :refer :all]
|
||||
[monger.operators :refer :all]
|
||||
[monger.conversion :refer :all]))
|
||||
|
||||
(let [conn (mg/connect)
|
||||
db (mg/get-db conn "monger-test")]
|
||||
(use-fixtures :each (fn [f]
|
||||
(mc/remove db "widgets")
|
||||
(f)
|
||||
(mc/remove db "widgets")))
|
||||
|
||||
(let [collection "widgets"
|
||||
mapper (js/load-resource "resources/mongo/js/mapfun1.js")
|
||||
reducer "function(key, values) {
|
||||
var result = 0;
|
||||
values.forEach(function(v) { result += v });
|
||||
|
||||
return result;
|
||||
}"
|
||||
batch [{ :state "CA" :quantity 1 :price 199.00 }
|
||||
{ :state "NY" :quantity 2 :price 199.00 }
|
||||
{ :state "NY" :quantity 1 :price 299.00 }
|
||||
{ :state "IL" :quantity 2 :price 11.50 }
|
||||
{ :state "CA" :quantity 2 :price 2.95 }
|
||||
{ :state "IL" :quantity 3 :price 5.50 }]
|
||||
expected [{:_id "CA", :value 204.9} {:_id "IL", :value 39.5} {:_id "NY", :value 697.0}]]
|
||||
(deftest test-basic-inline-map-reduce-example
|
||||
(mc/remove db collection)
|
||||
(mc/insert-batch db collection batch)
|
||||
(let [output (mc/map-reduce db collection mapper reducer nil MapReduceCommand$OutputType/INLINE {})
|
||||
results (from-db-object ^DBObject (.results ^MapReduceOutput output) true)]
|
||||
(is (= expected results))))
|
||||
|
||||
(deftest test-basic-map-reduce-example-that-replaces-named-collection
|
||||
(mc/remove db collection)
|
||||
(mc/insert-batch db collection batch)
|
||||
(let [output (mc/map-reduce db collection mapper reducer "mr_outputs" {})
|
||||
results (from-db-object ^DBObject (.results ^MapReduceOutput output) true)]
|
||||
(is (= 3 (mg/count results)))
|
||||
(is (= expected
|
||||
(map #(from-db-object % true) (seq results))))
|
||||
(is (= expected
|
||||
(map #(from-db-object % true) (mc/find db "mr_outputs"))))
|
||||
(.drop ^MapReduceOutput output)))
|
||||
|
||||
(deftest test-basic-map-reduce-example-that-merged-results-into-named-collection
|
||||
(mc/remove db collection)
|
||||
(mc/insert-batch db collection batch)
|
||||
(mc/map-reduce db collection mapper reducer "merged_mr_outputs" MapReduceCommand$OutputType/MERGE {})
|
||||
(mc/insert db collection { :state "OR" :price 17.95 :quantity 4 })
|
||||
(let [^MapReduceOutput output (mc/map-reduce db collection mapper reducer "merged_mr_outputs" MapReduceCommand$OutputType/MERGE {})]
|
||||
(is (= 4 (mg/count output)))
|
||||
(is (= ["CA" "IL" "NY" "OR"]
|
||||
(map :_id (mc/find-maps db "merged_mr_outputs"))))
|
||||
(.drop ^MapReduceOutput output)))))
|
||||
|
|
@ -3,28 +3,10 @@
|
|||
[monger.collection :as mc]
|
||||
[monger.js :as js]
|
||||
[clojure.test :refer :all]
|
||||
[clojure.set :refer [difference]]
|
||||
[monger.operators :refer :all])
|
||||
(:import [com.mongodb QueryOperators]))
|
||||
[monger.operators :refer :all]))
|
||||
|
||||
;; (use-fixtures :each purge-people purge-docs purge-things purge-libraries)
|
||||
|
||||
(deftest every-query-operator-is-defined
|
||||
(let [driver-query-operators (->> (.getDeclaredFields QueryOperators) (map #(.get % nil)) set)
|
||||
monger-query-operators (->> (ns-publics 'monger.operators) (map (comp name first)) set)
|
||||
; $within is deprecated and replaced by $geoWithin since v2.4.
|
||||
; $uniqueDocs is deprecated since v2.6.
|
||||
deprecated-query-operators #{"$within" "$uniqueDocs"}
|
||||
; Query modifier operators that are deprecated in the mongo shell since v3.2
|
||||
deprecated-meta-operators #{"$comment" "$explain" "$hint" "$maxScan"
|
||||
"$maxTimeMS" "$max" "$min" "$orderby"
|
||||
"$returnKey" "$showDiskLoc" "$snapshot" "$query"}
|
||||
undefined-non-deprecated-operators (difference driver-query-operators
|
||||
deprecated-query-operators
|
||||
deprecated-meta-operators
|
||||
monger-query-operators)]
|
||||
(is (= #{} undefined-non-deprecated-operators))))
|
||||
|
||||
(let [conn (mg/connect)
|
||||
db (mg/get-db conn "monger-test")]
|
||||
(defn purge-collections
|
||||
|
|
@ -54,29 +36,17 @@
|
|||
2 {:users {$lte 5}}
|
||||
1 {:users {$gt 10 $lt 150}})))
|
||||
|
||||
;;
|
||||
;; $eq
|
||||
;;
|
||||
|
||||
(deftest find-with-eq-operator
|
||||
(let [collection "libraries"]
|
||||
(mc/insert-batch db collection [{:language "Ruby" :name "mongoid" :users 1 :displayName nil}
|
||||
{:language "Clojure" :name "langohr" :users 5}
|
||||
{:language "Clojure" :name "incanter" :users 15}
|
||||
{:language "Scala" :name "akka" :users 150}])
|
||||
(is (= 2 (.count (mc/find db collection {:language {$eq "Clojure"}}))))))
|
||||
|
||||
;;
|
||||
;; $ne
|
||||
;;
|
||||
|
||||
(deftest find-with-ne-operator
|
||||
(deftest find-with-and-or-operators
|
||||
(let [collection "libraries"]
|
||||
(mc/insert-batch db collection [{:language "Ruby" :name "mongoid" :users 1}
|
||||
{:language "Clojure" :name "langohr" :users 5}
|
||||
{:language "Clojure" :name "incanter" :users 15}
|
||||
{:language "Scala" :name "akka" :users 150}])
|
||||
(is (= 2 (.count (mc/find db collection {:language {$ne "Clojure"}}))))))
|
||||
(is (= 2 (.count (mc/find db collection {$ne {:language "Clojure"}}))))))
|
||||
|
||||
|
||||
;;
|
||||
|
|
@ -137,10 +107,4 @@
|
|||
{:language {$regex "clo.*" $options "i"}} 2
|
||||
{:name {$regex "aK.*" $options "i"}} 1
|
||||
{:language {$regex ".*by"}} 1
|
||||
{:language {$regex ".*ala.*"}} 1)))
|
||||
|
||||
(deftest find-with-js-expression
|
||||
(let [collection "people"]
|
||||
(mc/insert-batch db collection [{:name "Bob" :placeOfBirth "New York" :address {:city "New York"}}
|
||||
{:name "Alice" :placeOfBirth "New York" :address {:city "Los Angeles"}}])
|
||||
(is (= 1 (.count (mc/find db collection {$where "this.placeOfBirth === this.address.city"})))))))
|
||||
{:language {$regex ".*ala.*"}} 1))))
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
(:require [monger.core :as mg]
|
||||
[monger.collection :as mc]
|
||||
monger.ragtime
|
||||
[ragtime.protocols :refer :all]
|
||||
[ragtime.core :refer :all]
|
||||
[clojure.test :refer :all]))
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,11 +15,8 @@
|
|||
date (Date.)
|
||||
doc { :created-at date :data-store "MongoDB" :language "Clojure" :_id doc-id }
|
||||
modified-doc { :created-at date :data-store "MongoDB" :language "Erlang" :_id doc-id }]
|
||||
(let [result (mc/update db collection { :language "Clojure" } doc {:upsert true})]
|
||||
(is (not (mgres/updated-existing? result)))
|
||||
(is (= 1 (mgres/affected-count result))))
|
||||
(is (not (mgres/updated-existing? (mc/update db collection { :language "Clojure" } doc {:upsert true}))))
|
||||
(is (mgres/updated-existing? (mc/update db collection { :language "Clojure" } doc {:upsert true})))
|
||||
(is (mgres/updated-existing? (mc/update db collection { :language "Clojure" } modified-doc {:multi false :upsert true})))
|
||||
(is (= 1 (mgres/affected-count (mc/remove db collection { :_id doc-id }))))
|
||||
(mgres/updated-existing? (mc/update db collection { :language "Clojure" } modified-doc {:multi false :upsert true}))
|
||||
(mc/remove db collection)
|
||||
(mg/disconnect conn))))
|
||||
|
|
|
|||
Loading…
Reference in a new issue