embulk-input-mongodb 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/CHANGELOG.md +97 -0
- data/README.md +33 -7
- data/build.gradle +1 -1
- data/src/main/java/org/embulk/input/mongodb/MongodbInputPlugin.java +77 -4
- data/src/test/java/org/embulk/input/mongodb/TestMongodbInputPlugin.java +24 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 669b8b7010ff112526a166dd4eef85a50656e77f
|
4
|
+
data.tar.gz: adea0810c4f04ee5cec5ec8ba7414557a8f179a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8fad0bab206efc47861e6cb714c1def66cbfcb7440e042584daf454f84ef2673cdd2c8482bb3edfe3920d3bf82827c99c6cccb06d2890ea2a823be8122fffe8
|
7
|
+
data.tar.gz: 277157cc6382dbb98795f6e3e0ef3aaa14a31faec1f663069d9bc133f4b246a6cb73da39a2e5c5b7f80a36ae4ade7145cd01464b9c9feec896eb205dbec2ba7b
|
data/.travis.yml
CHANGED
@@ -26,7 +26,8 @@ cache:
|
|
26
26
|
before_install:
|
27
27
|
- cat /etc/hosts # optionally check the content *before*
|
28
28
|
- sudo hostname "$(hostname | cut -c1-63)"
|
29
|
-
- sed -e "s/^\\(127\\.0\\.0\\.1.*\\)/\\1 $(hostname | cut -c1-63)/" /etc/hosts
|
29
|
+
- sed -e "s/^\\(127\\.0\\.0\\.1.*\\)/\\1 $(hostname | cut -c1-63)/" /etc/hosts > /tmp/hosts
|
30
|
+
- sudo mv /tmp/hosts /etc/hosts
|
30
31
|
- cat /etc/hosts # optionally check the content *after*
|
31
32
|
|
32
33
|
install:
|
@@ -42,14 +43,14 @@ install:
|
|
42
43
|
|
43
44
|
before_script:
|
44
45
|
- echo "Wait mongodb wakeup"
|
45
|
-
- sleep
|
46
|
+
- sleep 15
|
46
47
|
- mkdir -p ./tmp
|
47
48
|
- date
|
48
49
|
|
49
50
|
script:
|
50
51
|
- ./gradlew check
|
51
52
|
- ./gradlew package
|
52
|
-
- mongoimport --db $MONGO_DATABASE --collection $MONGO_COLLECTION --type json --drop src/test/resources/my_collection.jsonl
|
53
|
+
- mongoimport --host 127.0.0.1 --db $MONGO_DATABASE --collection $MONGO_COLLECTION --type json --drop src/test/resources/my_collection.jsonl
|
53
54
|
- |
|
54
55
|
for target in basic full id_field_name
|
55
56
|
do
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [v0.5.0](https://github.com/hakobera/embulk-input-mongodb/tree/v0.5.0) (2016-08-23)
|
4
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.4.0...v0.5.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Support separated URI params [\#24](https://github.com/hakobera/embulk-input-mongodb/pull/24) ([sakama](https://github.com/sakama))
|
9
|
+
|
10
|
+
**Merged pull requests:**
|
11
|
+
|
12
|
+
- Add --host option to mongoimport to prevent connection failure. [\#27](https://github.com/hakobera/embulk-input-mongodb/pull/27) ([hakobera](https://github.com/hakobera))
|
13
|
+
- Add document about batch\_size config [\#25](https://github.com/hakobera/embulk-input-mongodb/pull/25) ([hakobera](https://github.com/hakobera))
|
14
|
+
|
15
|
+
## [v0.4.0](https://github.com/hakobera/embulk-input-mongodb/tree/v0.4.0) (2016-07-08)
|
16
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.3.2...v0.4.0)
|
17
|
+
|
18
|
+
**Implemented enhancements:**
|
19
|
+
|
20
|
+
- Support incremental load [\#16](https://github.com/hakobera/embulk-input-mongodb/pull/16) ([sakama](https://github.com/sakama))
|
21
|
+
|
22
|
+
**Merged pull requests:**
|
23
|
+
|
24
|
+
- Bumpup version to 0.4.0 [\#23](https://github.com/hakobera/embulk-input-mongodb/pull/23) ([hakobera](https://github.com/hakobera))
|
25
|
+
|
26
|
+
## [v0.3.2](https://github.com/hakobera/embulk-input-mongodb/tree/v0.3.2) (2016-06-23)
|
27
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.3.1...v0.3.2)
|
28
|
+
|
29
|
+
**Implemented enhancements:**
|
30
|
+
|
31
|
+
- Support Symbol type [\#19](https://github.com/hakobera/embulk-input-mongodb/issues/19)
|
32
|
+
|
33
|
+
**Merged pull requests:**
|
34
|
+
|
35
|
+
- Bumpup version to 0.3.2 [\#22](https://github.com/hakobera/embulk-input-mongodb/pull/22) ([hakobera](https://github.com/hakobera))
|
36
|
+
- Release v0.3.1 [\#17](https://github.com/hakobera/embulk-input-mongodb/pull/17) ([hakobera](https://github.com/hakobera))
|
37
|
+
- Support Symbol type [\#21](https://github.com/hakobera/embulk-input-mongodb/pull/21) ([hakobera](https://github.com/hakobera))
|
38
|
+
|
39
|
+
## [v0.3.1](https://github.com/hakobera/embulk-input-mongodb/tree/v0.3.1) (2016-06-21)
|
40
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.3.0...v0.3.1)
|
41
|
+
|
42
|
+
**Implemented enhancements:**
|
43
|
+
|
44
|
+
- Support id\_field\_name config [\#15](https://github.com/hakobera/embulk-input-mongodb/pull/15) ([hakobera](https://github.com/hakobera))
|
45
|
+
|
46
|
+
**Closed issues:**
|
47
|
+
|
48
|
+
- readName can only be called when State is NAME, not when State is VALUE. [\#18](https://github.com/hakobera/embulk-input-mongodb/issues/18)
|
49
|
+
|
50
|
+
## [v0.3.0](https://github.com/hakobera/embulk-input-mongodb/tree/v0.3.0) (2016-06-13)
|
51
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.2.0...v0.3.0)
|
52
|
+
|
53
|
+
**Merged pull requests:**
|
54
|
+
|
55
|
+
- Add checkstyle plugin and format code [\#14](https://github.com/hakobera/embulk-input-mongodb/pull/14) ([sakama](https://github.com/sakama))
|
56
|
+
- Bumpup version to 0.3.0 [\#13](https://github.com/hakobera/embulk-input-mongodb/pull/13) ([hakobera](https://github.com/hakobera))
|
57
|
+
- Add unit test for existing code, \#9 and \#10 [\#11](https://github.com/hakobera/embulk-input-mongodb/pull/11) ([sakama](https://github.com/sakama))
|
58
|
+
- Change schema convert logic [\#10](https://github.com/hakobera/embulk-input-mongodb/pull/10) ([sakama](https://github.com/sakama))
|
59
|
+
|
60
|
+
## [v0.2.0](https://github.com/hakobera/embulk-input-mongodb/tree/v0.2.0) (2016-05-30)
|
61
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.1.2...v0.2.0)
|
62
|
+
|
63
|
+
**Implemented enhancements:**
|
64
|
+
|
65
|
+
- Support JSON type [\#6](https://github.com/hakobera/embulk-input-mongodb/issues/6)
|
66
|
+
|
67
|
+
**Merged pull requests:**
|
68
|
+
|
69
|
+
- Prepare release for v0.2.0 [\#12](https://github.com/hakobera/embulk-input-mongodb/pull/12) ([hakobera](https://github.com/hakobera))
|
70
|
+
- Add minimum limit to batch\_size and changed not to allow null [\#9](https://github.com/hakobera/embulk-input-mongodb/pull/9) ([sakama](https://github.com/sakama))
|
71
|
+
- Refactor some codes [\#8](https://github.com/hakobera/embulk-input-mongodb/pull/8) ([sakama](https://github.com/sakama))
|
72
|
+
- Fix example config on readme [\#5](https://github.com/hakobera/embulk-input-mongodb/pull/5) ([hakobera](https://github.com/hakobera))
|
73
|
+
- Support JSON type [\#7](https://github.com/hakobera/embulk-input-mongodb/pull/7) ([hakobera](https://github.com/hakobera))
|
74
|
+
|
75
|
+
## [v0.1.2](https://github.com/hakobera/embulk-input-mongodb/tree/v0.1.2) (2015-09-10)
|
76
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.1.1...v0.1.2)
|
77
|
+
|
78
|
+
**Merged pull requests:**
|
79
|
+
|
80
|
+
- Change build option for JDK7 [\#4](https://github.com/hakobera/embulk-input-mongodb/pull/4) ([hakobera](https://github.com/hakobera))
|
81
|
+
- Set homepage info [\#3](https://github.com/hakobera/embulk-input-mongodb/pull/3) ([hakobera](https://github.com/hakobera))
|
82
|
+
|
83
|
+
## [v0.1.1](https://github.com/hakobera/embulk-input-mongodb/tree/v0.1.1) (2015-09-06)
|
84
|
+
[Full Changelog](https://github.com/hakobera/embulk-input-mongodb/compare/v0.1.0...v0.1.1)
|
85
|
+
|
86
|
+
## [v0.1.0](https://github.com/hakobera/embulk-input-mongodb/tree/v0.1.0) (2015-09-06)
|
87
|
+
**Implemented enhancements:**
|
88
|
+
|
89
|
+
- Fix projection logic and better logging [\#2](https://github.com/hakobera/embulk-input-mongodb/pull/2) ([hakobera](https://github.com/hakobera))
|
90
|
+
|
91
|
+
**Merged pull requests:**
|
92
|
+
|
93
|
+
- Run test on travis [\#1](https://github.com/hakobera/embulk-input-mongodb/pull/1) ([hakobera](https://github.com/hakobera))
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/README.md
CHANGED
@@ -14,7 +14,16 @@ This plugin only works with embulk >= 0.8.8.
|
|
14
14
|
|
15
15
|
## Configuration
|
16
16
|
|
17
|
-
-
|
17
|
+
- Connection parameters
|
18
|
+
One of them is required.
|
19
|
+
|
20
|
+
- use MongoDB connection string URI
|
21
|
+
- **uri**: [MongoDB connection string URI](http://docs.mongodb.org/manual/reference/connection-string/) (e.g. 'mongodb://localhost:27017/mydb') (string, required)
|
22
|
+
- use separated URI parameters
|
23
|
+
- **hosts**: list of hosts. `hosts` are pairs of host(string, required) and port(integer, optional, default: 27017)
|
24
|
+
- **user**: (string, optional)
|
25
|
+
- **password**: (string, optional)
|
26
|
+
- **database**: (string, required)
|
18
27
|
- **collection**: source collection name (string, required)
|
19
28
|
- **fields**: **(deprecated)** ~~hash records that has the following two fields (array, required)~~
|
20
29
|
~~- name: Name of the column~~
|
@@ -24,12 +33,13 @@ This plugin only works with embulk >= 0.8.8.
|
|
24
33
|
~~- double~~
|
25
34
|
~~- string~~
|
26
35
|
~~- timestamp~~
|
27
|
-
- **id_field_name**
|
28
|
-
- **query**:
|
36
|
+
- **id_field_name** Name of Object ID field name. Set if you want to change the default name `_id` (string, optional, default: "_id")
|
37
|
+
- **query**: A JSON document used for [querying](https://docs.mongodb.com/manual/tutorial/query-documents/) on the source collection. Documents are loaded from the colleciton if they match with this condition. (string, optional)
|
29
38
|
- **projection**: A JSON document used for [projection](https://docs.mongodb.com/manual/reference/operator/projection/positional/) on query results. Fields in a document are used only if they match with this condition. (string, optional)
|
30
|
-
- **sort**:
|
31
|
-
- **
|
32
|
-
- **
|
39
|
+
- **sort**: Ordering of results (string, optional)
|
40
|
+
- **batch_size**: Limits the number of objects returned in one [batch](http://api.mongodb.com/java/current/com/mongodb/DBCursor.html#batchSize-int-) (integer, optional, default: 10000)
|
41
|
+
- **incremental_field** List of field name (list, optional, can't use with sort option)
|
42
|
+
- **last_record** Last loaded record for incremental load (hash, optional)
|
33
43
|
- **stop_on_invalid_record** Stop bulk load transaction if a document includes invalid record (such as unsupported object type) (boolean, optional, default: false)
|
34
44
|
- **json_column_name**: column name used in outputs (string, optional, default: "json")
|
35
45
|
|
@@ -37,6 +47,8 @@ This plugin only works with embulk >= 0.8.8.
|
|
37
47
|
|
38
48
|
### Exporting all objects
|
39
49
|
|
50
|
+
#### Specify with MongoDB connection string URI.
|
51
|
+
|
40
52
|
```yaml
|
41
53
|
in:
|
42
54
|
type: mongodb
|
@@ -44,6 +56,20 @@ in:
|
|
44
56
|
collection: "my_collection"
|
45
57
|
```
|
46
58
|
|
59
|
+
#### Specify with separated URI parameters.
|
60
|
+
|
61
|
+
```yaml
|
62
|
+
in:
|
63
|
+
type: mongodb
|
64
|
+
hosts:
|
65
|
+
- {host: localhost, port: 27017}
|
66
|
+
- {host: example.com, port: 27017}
|
67
|
+
user: myuser
|
68
|
+
password: mypassword
|
69
|
+
database: my_database
|
70
|
+
collection: "my_collection"
|
71
|
+
```
|
72
|
+
|
47
73
|
### Filtering documents by query and projection
|
48
74
|
|
49
75
|
```yaml
|
@@ -187,4 +213,4 @@ $ launchctl load ~/Library/LaunchAgents/environment.plist
|
|
187
213
|
$ launchctl getenv MONGO_URI //try to get value.
|
188
214
|
|
189
215
|
Then start your applications.
|
190
|
-
```
|
216
|
+
```
|
data/build.gradle
CHANGED
@@ -5,7 +5,9 @@ import com.google.common.base.Optional;
|
|
5
5
|
import com.google.common.base.Throwables;
|
6
6
|
import com.mongodb.MongoClient;
|
7
7
|
import com.mongodb.MongoClientURI;
|
8
|
+
import com.mongodb.MongoCredential;
|
8
9
|
import com.mongodb.MongoException;
|
10
|
+
import com.mongodb.ServerAddress;
|
9
11
|
import com.mongodb.client.MongoCollection;
|
10
12
|
import com.mongodb.client.MongoCursor;
|
11
13
|
import com.mongodb.client.MongoDatabase;
|
@@ -42,6 +44,8 @@ import javax.validation.constraints.Min;
|
|
42
44
|
|
43
45
|
import java.io.IOException;
|
44
46
|
import java.net.UnknownHostException;
|
47
|
+
import java.util.ArrayList;
|
48
|
+
import java.util.Arrays;
|
45
49
|
import java.util.HashMap;
|
46
50
|
import java.util.LinkedHashMap;
|
47
51
|
import java.util.List;
|
@@ -50,12 +54,40 @@ import java.util.Map;
|
|
50
54
|
public class MongodbInputPlugin
|
51
55
|
implements InputPlugin
|
52
56
|
{
|
57
|
+
public interface HostTask
|
58
|
+
extends Task
|
59
|
+
{
|
60
|
+
@Config("host")
|
61
|
+
String getHost();
|
62
|
+
|
63
|
+
@Config("port")
|
64
|
+
@ConfigDefault("27017")
|
65
|
+
int getPort();
|
66
|
+
}
|
67
|
+
|
53
68
|
public interface PluginTask
|
54
69
|
extends Task
|
55
70
|
{
|
56
71
|
// MongoDB connection string URI
|
57
72
|
@Config("uri")
|
58
|
-
|
73
|
+
@ConfigDefault("null")
|
74
|
+
Optional<String> getUri();
|
75
|
+
|
76
|
+
@Config("hosts")
|
77
|
+
@ConfigDefault("null")
|
78
|
+
Optional<List<HostTask>> getHosts();
|
79
|
+
|
80
|
+
@Config("user")
|
81
|
+
@ConfigDefault("null")
|
82
|
+
Optional<String> getUser();
|
83
|
+
|
84
|
+
@Config("password")
|
85
|
+
@ConfigDefault("null")
|
86
|
+
Optional<String> getPassword();
|
87
|
+
|
88
|
+
@Config("database")
|
89
|
+
@ConfigDefault("null")
|
90
|
+
Optional<String> getDatabase();
|
59
91
|
|
60
92
|
@Config("collection")
|
61
93
|
String getCollection();
|
@@ -261,15 +293,56 @@ public class MongodbInputPlugin
|
|
261
293
|
|
262
294
|
private MongoDatabase connect(final PluginTask task) throws UnknownHostException, MongoException
|
263
295
|
{
|
264
|
-
|
265
|
-
|
296
|
+
MongoClient mongoClient;
|
297
|
+
String database;
|
298
|
+
|
299
|
+
if (!task.getUri().isPresent() && !task.getHosts().isPresent()) {
|
300
|
+
throw new ConfigException("'uri' or 'hosts' is required");
|
301
|
+
}
|
302
|
+
|
303
|
+
if (task.getUri().isPresent()) {
|
304
|
+
MongoClientURI uri = new MongoClientURI(task.getUri().get());
|
305
|
+
database = uri.getDatabase();
|
306
|
+
mongoClient = new MongoClient(uri);
|
307
|
+
}
|
308
|
+
else {
|
309
|
+
mongoClient = createClientFromParams(task);
|
310
|
+
database = task.getDatabase().get();
|
311
|
+
}
|
266
312
|
|
267
|
-
MongoDatabase db = mongoClient.getDatabase(
|
313
|
+
MongoDatabase db = mongoClient.getDatabase(database);
|
268
314
|
// Get collection count for throw Exception
|
269
315
|
db.getCollection(task.getCollection()).count();
|
270
316
|
return db;
|
271
317
|
}
|
272
318
|
|
319
|
+
private MongoClient createClientFromParams(PluginTask task)
|
320
|
+
{
|
321
|
+
if (!task.getHosts().isPresent()) {
|
322
|
+
throw new ConfigException("'hosts' option's value is required but empty");
|
323
|
+
}
|
324
|
+
if (!task.getDatabase().isPresent()) {
|
325
|
+
throw new ConfigException("'database' option's value is required but empty");
|
326
|
+
}
|
327
|
+
|
328
|
+
List<ServerAddress> addresses = new ArrayList<>();
|
329
|
+
for (HostTask host : task.getHosts().get()) {
|
330
|
+
addresses.add(new ServerAddress(host.getHost(), host.getPort()));
|
331
|
+
}
|
332
|
+
|
333
|
+
if (task.getUser().isPresent()) {
|
334
|
+
MongoCredential credential = MongoCredential.createCredential(
|
335
|
+
task.getUser().get(),
|
336
|
+
task.getDatabase().get(),
|
337
|
+
task.getPassword().get().toCharArray()
|
338
|
+
);
|
339
|
+
return new MongoClient(addresses, Arrays.asList(credential));
|
340
|
+
}
|
341
|
+
else {
|
342
|
+
return new MongoClient(addresses);
|
343
|
+
}
|
344
|
+
}
|
345
|
+
|
273
346
|
private Map<String, String> buildIncrementalCondition(PluginTask task)
|
274
347
|
{
|
275
348
|
Map<String, String> result = new HashMap<>();
|
@@ -4,7 +4,9 @@ import com.fasterxml.jackson.databind.JsonNode;
|
|
4
4
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
5
5
|
import com.google.common.base.Optional;
|
6
6
|
import com.google.common.collect.ImmutableList;
|
7
|
+
import com.google.common.collect.ImmutableMap;
|
7
8
|
import com.google.common.collect.Lists;
|
9
|
+
import com.mongodb.MongoClientURI;
|
8
10
|
import com.mongodb.client.MongoCollection;
|
9
11
|
import com.mongodb.client.MongoDatabase;
|
10
12
|
import org.bson.BsonBinary;
|
@@ -198,6 +200,28 @@ public class TestMongodbInputPlugin
|
|
198
200
|
assertValidRecords(getFieldSchema(), output);
|
199
201
|
}
|
200
202
|
|
203
|
+
@Test
|
204
|
+
public void testRunWithConnectionParams() throws Exception
|
205
|
+
{
|
206
|
+
MongoClientURI uri = new MongoClientURI(MONGO_URI);
|
207
|
+
String host = uri.getHosts().get(0);
|
208
|
+
Integer port = (host.split(":")[1] != null) ? Integer.valueOf(host.split(":")[1]) : 27017;
|
209
|
+
ConfigSource config = Exec.newConfigSource()
|
210
|
+
.set("hosts", Arrays.asList(ImmutableMap.of("host", host.split(":")[0], "port", port)))
|
211
|
+
.set("user", uri.getUsername())
|
212
|
+
.set("password", uri.getPassword())
|
213
|
+
.set("database", uri.getDatabase())
|
214
|
+
.set("collection", MONGO_COLLECTION);
|
215
|
+
PluginTask task = config.loadConfig(PluginTask.class);
|
216
|
+
|
217
|
+
dropCollection(task, MONGO_COLLECTION);
|
218
|
+
createCollection(task, MONGO_COLLECTION);
|
219
|
+
insertDocument(task, createValidDocuments());
|
220
|
+
|
221
|
+
plugin.transaction(config, new Control());
|
222
|
+
assertValidRecords(getFieldSchema(), output);
|
223
|
+
}
|
224
|
+
|
201
225
|
@Test
|
202
226
|
public void testRunWithIncrementalLoad() throws Exception
|
203
227
|
{
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-input-mongodb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuyuki Honda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- .gitignore
|
49
49
|
- .travis.yml
|
50
|
+
- CHANGELOG.md
|
50
51
|
- LICENSE.txt
|
51
52
|
- README.md
|
52
53
|
- build.gradle
|
@@ -67,7 +68,7 @@ files:
|
|
67
68
|
- src/test/resources/id_field_name.yml
|
68
69
|
- src/test/resources/id_field_name_expected.csv
|
69
70
|
- src/test/resources/my_collection.jsonl
|
70
|
-
- classpath/embulk-input-mongodb-0.
|
71
|
+
- classpath/embulk-input-mongodb-0.5.0.jar
|
71
72
|
- classpath/mongo-java-driver-3.2.2.jar
|
72
73
|
homepage: https://github.com/hakobera/embulk-input-mongodb
|
73
74
|
licenses:
|