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 Extended 库中。
此依赖项包含在 apoc-mongodb-dependencies-2025.10.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:查询参数映射(可以是 Map 或 JSON 字符串) -
update:更新参数映射(仅适用于apoc.mongo.update) -
documents:要插入的文档(仅适用于apoc.mongo.insert) -
config:参见下文
配置参数
该过程支持以下配置参数
| 名称 (name) | type | 默认 | description(描述) |
|---|---|---|---|
extractReferences |
|
false |
如果为 true 且某个字段包含 |
objectIdAsMap |
|
true |
如果为 true,则将 |
project |
|
空 |
投影参数(可以是 Map 或 JSON 字符串) |
sort |
|
空 |
排序参数(可以是 Map 或 JSON 字符串) |
skip |
|
0 |
跳过的文档数量 |
limit |
|
0 |
显示的最大文档数量 |
collection |
|
空 |
集合名称(优先级高于 |
示例
假设有以下集合
// 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'} }])
| 值 |
|---|
|
|
apoc.mongo.count
CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin')
| 值 |
|---|
3 |
我们也可以通过 config 参数传递集合名称
CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb?authSource=admin', {collection: 'Person'})
| 值 |
|---|
3 |
apoc.mongo.find
如果我们想使用默认参数提取所有 `Person`
CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin')
| 值 |
|---|
|
|
|
此外,我们可以这样传递查询参数
CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'bar*', `$options`: ''}})
| 值 |
|---|
|
如果我们想通过 config 参数提取 bought 引用
CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {extractReferences: true})
| 值 |
|---|
|
此外,我们可以通过 objectIdAsMap 配置获取 ObjectId 及其 HexString 表示
CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {objectIdAsMap: false, extractReferences: true})
| 值 |
|---|
|
此外,我们可以跳过 n 个值并传递投影参数
CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 2, project: {age: 1}})
| 值 |
|---|
|
我们可以将 query、skip 和 sort 参数作为字符串化值传递,例如
CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', '{foo: "bar"}', {sort: '{name: -1}', project: '{age: 1}'})
| 值 |
|---|
|
|
此外,我们可以使用 limit 参数,例如
CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 1, limit: 1, project: {age: 1}})
| 值 |
|---|
|
此外,我们可以传递 sort 参数,例如
CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {sort: {name: -1}, objectIdAsMap: false, project: {name: 1}})
| 值 |
|---|
`` { "_id": "personJohn", "name": "John", } |
`` { "_id": "personJack", "name": "Jack", } |
|
apoc.mongo.update
更新 John 文档的 age 属性
CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}, {`$set`: {age:99}})
结果为受影响的行数
| 值 |
|---|
1 |
apoc.mongo.delete
删除 John 文档
CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"})
结果为受影响的行数
| 值 |
|---|
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}])