MongoDB

可用过程

签名

apoc.mongo.aggregate(uri, pipeline, $config) yield value - 对 MongoDB 集合执行聚合操作

apoc.mongo.count(uri, query, $config) yield value - 对 MongoDB 集合执行计数操作

apoc.mongo.find(uri, query, $config) yield value - 对 MongoDB 集合执行查找操作

apoc.mongo.delete(uri, query, $config) - 从 MongoDB 集合中删除给定的文档,并返回受影响的文档数量

apoc.mongo.insert(uri, documents, $config) yield value - 将给定的文档插入 MongoDB 集合

apoc.mongo.update(uri, query, update, $config) - 更新 MongoDB 集合中的给定文档,并返回受影响的文档数量

安装依赖项

Mongo 过程依赖于 APOC 扩展库中未包含的客户端库。

此依赖项包含在 apoc-mongodb-dependencies-5.21.0-all.jar 中,可以从 发行页面 下载。下载该文件后,应将其放置在 plugins 目录中,并重新启动 Neo4j 服务器。

字段描述

  • uri: 连接字符串 URI,方案为 mongodb://[username:password@]host1[:port1][,host2[:port2],…​[,hostN[:portN]]]/databaseName.collectionName[?options]。请注意,此 uri 必须包含数据库名称,并且(如果 collection 配置参数未明确指定)还必须包含集合名称(例如 mongodb://user:pass@localhost:27017/myDb.myCollection?authSource=admin

  • query: 查询参数映射(可以是映射或 json 字符串)

  • update: 更新参数映射(仅适用于 apoc.mongo.update

  • documents: 要插入的文档(仅适用于 apoc.mongo.insert

  • config: 请参见下文

配置参数

这些过程支持以下配置参数

表 1. 配置参数
名称 类型 默认值 描述

extractReferences

布尔值

false

如果为 true 且字段包含 ObjectId,则它将包含相关文档而不是 ObjectId

objectIdAsMap

布尔值

true

如果为 true,则将 ObjectId 提取为映射

project

Map<K,V>String

投影参数(可以是 map 或 json 字符串)

排序

Map<K,V>String

排序参数(可以是 map 或 json 字符串)

跳过

Long

0

要跳过的文档数量

限制

Long

0

要显示的文档最大数量

集合

String

集合名称(优先于使用 uri 参数传递的集合)

示例

给定以下集合

// Product
...
{"_id": ObjectId("product1"), "name": "Product 1", "price": 100}
{"_id": ObjectId("product3"), "name": "Product 2", "price": 200}
{"_id": ObjectId("product3"), "name": "Product 3", "price": 300}
...
// Person
...
{"_id": ObjectId("personAl"), "name": "Al", expr: BsonRegularExpression("foo*"), "bought": [ObjectId("product1"), ObjectId("product3")]}
{"_id": ObjectId("personJohn"), "name": "John", "age": 40, "foo", "bar"}
{"_id": ObjectId("personJack"), "name": "Jack", "age": 50, "foo", "bar", expr: BsonRegularExpression("bar*"), "bought": [ObjectId("product1"), ObjectId("product2")]}
...

我们可以执行以下操作。

apoc.mongo.aggregate

CALL apoc.mongo.aggregate('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', [{`$match`: {foo: 'bar'}}, {`$set`: {aggrField: 'Y'} }])
表 2. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "John", "foo": "bar", "age": 40L, "aggrField": "Y", }

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Jack", "age": 50L, "foo": "bar", "expr": "bar*", "bought": ["product1", "product2"], "aggrField": "Y", }

apoc.mongo.count

CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin')
表 3. 结果

3

我们也可以通过 config 参数传递集合名称

CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb?authSource=admin', {collection: 'Person'})
表 4. 结果

3

apoc.mongo.find

如果我们想提取所有使用默认参数的 Person

CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin')
表 5. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Al", "expr": "foo*", "bought": ["product1", "product3"] }

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "John", "foo": "bar", "age": 40L }

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Jack", "age": 50L, "foo": "bar", "expr": "bar*", "bought": ["product1", "product2"] }

此外,我们可以像这样传递查询参数

CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'bar*', `$options`: ''}})
表 6. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Jack", "foo": "bar", "expr": "bar*", "bought": ["product1", "product2"] }

如果我们想通过 config 参数提取 bought 引用

CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {extractReferences: true})
表 7. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Al", "expr": "foo*", "bought": [ { "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Product 1", "price": 100 }, { "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "name": "Product 3", "price": 300 }, ] }

此外,我们可以通过 objectIdAsMap config 获取带有 HexString 表示形式的 ObjectId

CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {objectIdAsMap: false, extractReferences: true})
表 8. 结果

{ "_id": "personAl", "name": "Al", "expr": "foo*", "bought": [ {"_id": "product1", "name": "Product 1", "price": 100}, {"_id": "product3", "name": "Product 3", "price": 300} ] }

此外,我们可以跳过 n 个值并传递投影参数

CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 2, project: {age: 1}})
表 9. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "age": 50L, }

我们可以将 queryskipsort 参数作为字符串化的值传递,例如

CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', '{foo: "bar"}', {sort: '{name: -1}', project: '{age: 1}'})
表 10. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "age": 40L, }

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "age": 50L, }

此外,我们可以使用 limit 参数,例如

CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 1, limit: 1, project: {age: 1}})
表 11. 结果

{ "_id": { "timestamp": <…​>, "machineIdentifier": <…​>, "processIdentifier": <…​>, "counter": <…​>, }, "age": 40, }

此外,我们可以传递 sort 参数,例如

CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {sort: {name: -1}, objectIdAsMap: false, project: {name: 1}})
表 12. 结果

`` { "_id": "personJohn", "name": "John", }

`` { "_id": "personJack", "name": "Jack", }

{ "_id": "personAl", "name": "Al", }

apoc.mongo.update

要更新 John 文档的 age 属性

CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}, {`$set`: {age:99}})

结果为受影响的行数

表 13. 结果

1

apoc.mongo.delete

要删除 John 文档

CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"})

结果为受影响的行数

表 14. 结果

1

apoc.mongo.insert

要在 Person 集合中插入 2 个文档 {"secondId": ObjectId("507f191e811c19729de860ea"), "baz": 1}{"secondId": ObjectId("507f191e821c19729de860ef"), "baz": 1}(在这种情况下,过程将返回 void

CALL apoc.mongo.insert('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', [{secondId: {`$oid`: '507f191e811c19729de860ea'}, baz: 1}, {secondId: {`$oid`: '507f191e821c19729de860ef'}, baz: 1}])