java - 使用带有 Java 异步驱动程序的查找管道
问题描述
想要使用异步 java 驱动程序进行查找以加入 2 个集合。但是我无法弄清楚要使用的正确语法,因为我找不到任何有关使用 $lookup 命令的 Let(变量)版本的语法是什么的文档才能正常工作。
这是使用的内容(它没有找到任何匹配项):
final List<Bson> lookUppipeline = new ArrayList<>();
final List<Variable<?>> variables = Arrays.asList(new Variable<>("id", "$_id"));
lookUppipeline.add(match(eq("object_id", "$$id")));
final Bson lookup = lookup("values_collection", variables, lookUppipeline, "tag_values");
final AggregateIterable<ApiJsonObject> findIter = info_collection.aggregate(Arrays.asList(lookup, skip(0), limit(1_000), project(exclude(EXCLUDES_LIST))));
基本上$_id
ininfo_collection
等于object_id
的values_collection
。
我是否需要以不同方式创建变量或匹配等于?如果我使用查找方法的外键版本,它可以工作,但我需要使用管道,因为我还有其他东西要添加到它。
有使用同步驱动程序但不使用异步驱动程序的示例。
来自 mongodb 查询的语法是
db.info_collection.aggregate([
{
$lookup:{
from: "values_collection",
let: { id: "$_id" },
pipeline: [
{ $match:
{ $expr:
{ $and:
[
{ $eq: [ "$object_id", "$$id" ] }
]
}
}
}
],
as: "tag_values"
}
}
])
以下是一些示例数据(精简但所有相关):
info_collection
:
[
{"_id":"cce9ec95-dd03-4066-89c5-86227be70503", "Name":"Object1" }
{"_id":"cce9ec95-dd03-4066-89c5-86227be70503", "Name":"Object2" }
{"_id":"cce9ec95-dd03-4066-89c5-86227be70503", "Name":"Object3" }
{"_id":"cce9ec95-dd03-4066-89c5-86227be70503", "Name":"Object4" }
{"_id":"cce9ec95-dd03-4066-89c5-86227be70503", "Name":"Object5" }
]
values_collection
:
[
{"object":"cce9ec95-dd03-4066-89c5-86227be70503", "_id":{"$oid":"5e1cee26610b668017537cc2"}, "Value":"test1", "Tag":1},
{"object":"6494bcec-c94f-4421-9f5a-84a76edda8fd", "_id":{"$oid":"5e1cee26610b668017537cc4"}, "Value":"test2", "Tag":1},
{"object":"ea40aaf7-1d7c-4bf2-8a98-93cfbf62035d", "_id":{"$oid":"5e1cee26610b668017537cc6"}, "Value":"test3", "Tag":1},
{"object":"7556a86d-4962-4220-8a77-10655e8e4376", "_id":{"$oid":"5e1cee26610b668017537cc8"}, "Value":"test4", "Tag":1},
{"object":"f78d4302-0756-47bb-aaff-c93744d147fe", "_id":{"$oid":"5e1cee26610b668017537cca"}, "Value":"test5", "Tag":1},
{"object":"06ade084-3e2a-42eb-9063-5059c447e518", "_id":{"$oid":"5e1cee26610b668017537ccc"}, "Value":"test6", "Tag":1}
]
解决方案
找出答案,我猜你不能使用简写辅助函数,但必须将参数作为 Documents 传递。
这包括为什么我不能使用其他查找函数的额外相等参数。
final List<Variable<?>> variables = Arrays.asList(new Variable<>("key", "$_id"));
final List<Bson> pipeline = Arrays.asList(match(expr(new Document("$and",
Arrays.asList(new Document("$eq", Arrays.asList("$object_id", "$$key")),
new Document("$eq", Arrays.asList("$tag", tagId)),
new Document("$eq", Arrays.asList("$value", value)))))),
project(fields(include("tag_values", "_id"))));
final Bson lookup = lookup("values_collection", variables, pipeline, "tag_values");
final AggregateIterable<ApiJsonObject> findIter = info_collection.aggregate(Arrays.asList(lookup, unwind("$tag_values"), skip(0), limit(1_000), project(exclude(EXCLUDES_LIST))));
推荐阅读
- python - python中的加权最小绝对回归?
- vue.js - Feathers vuex:刷新后用户不再登录
- flutter - 使用应用图标打开应用时获取所有通知消息(如果有)
- laravel - Vuetify 中的未知自定义元素
- python - 散景:触发回调后,Hovertool 在旧实例上堆叠
- vba - 如何创建邮件项?
- javascript - 在服务器端代码命中之前获取 AjaxUpload 中的 onComplete
- r - 基于条件的R数据表分组并根据条件获取计数
- javascript - 如何使用 Javascript 读取具有自动生成的文档 ID 的 Firebase 文档
- vb.net - IsNumeric() 允许最后的值减去