java - 将查找管道与 Java 异步驱动程序结合使用

标签 java mongodb mongo-java mongo-java-driver

绑定(bind)使用异步 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))));

基本上,info_collection 中的 $_id 等于 values_collectionobject_id

我需要以不同的方式创建变量还是匹配相等?如果我使用查找方法的外键版本,它可以工作,但我需要使用管道,因为我还有其他东西要添加到其中。

有使用同步驱动程序但不使用异步驱动程序的示例。

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}
]

最佳答案

找出答案,我想对于聚合,您不能使用速记辅助函数,但必须将参数作为文档传递。

这包括额外的 equal 参数,解释了为什么我无法使用其他查找函数。

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))));

关于java - 将查找管道与 Java 异步驱动程序结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59724026/

相关文章:

MongoDB 查询多个字段

Java:导入父级包

java - 如何返回 DataSnapshot 值作为方法的结果?

java - 在 javadoc 中,@throws 和 @exception 标签有什么区别?

javascript - 当发布的光标基于另一个集合内容时,如何构建响应式(Reactive)发布?

javascript - 使用正则表达式使用 mongoose 进行不区分大小写的查找

java - 如何用java计算支持度的置信度

java - 如何在从mongodb聚合查询的java对象中保存数据

java - 无法在java中通过JNDI连接MongoDb

java - mongo + java + 打开的文件太多