Использование конвейеров поиска с драйвером Java Asyn c - PullRequest
0 голосов
/ 13 января 2020

Попытка получить поиск, работающий с драйвером asyn c java, чтобы объединить 2 коллекции. Но я не могу определить правильный синтаксис для использования, так как я не могу найти документацию о том, что синтаксис использует версию Let (variable) команды $ lookup для правильной работы.

Вот что использует (и не находит совпадений):

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 в info_collection равно object_id из values_collection.

Нужно ли создавать переменную по-другому или совпадение равно? Если я использую версию метода поиска с внешним ключом, он работает, но мне нужно использовать конвейеры, так как у меня есть другие вещи, которые нужно добавить к нему.

Есть примеры использования драйвера syn c, но не с asyn c driver.

Синтаксис запроса 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}
]

1 Ответ

0 голосов
/ 14 января 2020

Понял ответ, я думаю, что с агрегатами вы не можете использовать вспомогательные функции сокращения, но должны передавать параметры как документы.

Это включает дополнительный параметр равенства, почему я не смог использовать другая функция поиска.

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