Java implémente une requête d'association à deux tables pour mongoDB

Java implémente une requête d'association à deux tables pour mongoDB

Enregistrez le processus d'apprentissage de Java pour implémenter la requête d'association à deux tables de mongodb, ce qui est pratique pour vérifier quand vous en aurez besoin à l'avenir.

Scénario: Il y a deux tables dans mongodb, vous devez effectuer une requête associée basée sur l'id.

Les données du tableau 1 sont les suivantes:

Les données du tableau 2 sont les suivantes:

Pour réaliser la requête associée de deux tables, vous devez utiliser la recherche de mongodb. Lorsque le résultat de la requête est renvoyé, vous devez filtrer les données qui n'ont aucun jeu de résultats est vide. À ce stade, vous devez utiliser la correspondance de mongodb.

L'implémentation java nécessite le package mongo-java-driver. Ici, mongo-java-driver-3.9.0.jar est utilisé. Les dépendances du miroir Maven d'Ali sont les suivantes

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.9.0</version>
</dependency>

Le code Java est implémenté comme suit:

MongoClient mongoClient = new MongoClient("localhost", 27017);

//“test”为连接的数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

//test1是表1
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection("test1");

List<Bson> aggregateList = new ArrayList<>(1);

//利用lookup进行关联查询
//test2是表2,两个表根据id进行关联,关联的结果定义一个新的字段

/**Aggregates.lookup函数的说明:
     * lookup(final String from, final String localField, final String foreignField, final String as)
     * Creates a $lookup pipeline stage, joining the current collection with the one specified in from
     * using equality match between the local field and the foreign field
     * @param from         the name of the collection in the same database to perform the join with.
     * @param localField   the field from the local collection to match values against.
     * @param foreignField the field in the from collection to match values against.
     * @param as           the name of the new array field to add to the input documents.
     */
aggregateList.add(Aggregates.lookup("test2", "id", "id", "result"));

//利用match将没有关联到的结果过滤掉
aggregateList.add(Aggregates.match(Filters.ne("result", new ArrayList<String>(0))));
AggregateIterable<Document> aggregateIterable = mongoCollection.aggregate(aggregateList);
for (Document document : aggregateIterable) {
    System.out.println(document.toJson());
}

Les résultats renvoyés sont les suivants:

{ "_id" : { "oid" : "5e92c58671f9147a73e03662" }, "id" : "aaa", "keys" : ["name", "mobile"], "values" : ["姓名", "手机"], "result" : [{ "_id" : { "oid" : "5e92c48571f9147a73e0365f" }, "id" : "aaa", "name" : "张三", "mobile" : "12345678987" }, { "_id" : { "oid" : "5e92d5e871f9147a73e03667" }, "id" : "aaa", "name" : "李四", "mobile" : "12345678987" }] }

{ "_id" : { "oid" : "5e92c64e71f9147a73e03664" }, "id" : "ccc", "keys" : ["imsi", "mobile"], "values" : ["IMSI", "手机"], "result" : [{ "_id" : { "oid" : "5e92c73f71f9147a73e03665" }, "id" : "ccc", "imsi" : "28834765932", "mobile" : "12345678987" }] }

L'ensemble du processus de mise en œuvre nécessite une certaine compréhension du concept de «pipeline» dans mongodb. Par exemple, dans ce scénario, les résultats de la requête sont d'abord interrogés via la recherche, puis l'ensemble de résultats est transmis pour correspondre au filtrage via le «pipeline».

Je suppose que tu aimes

Origine www.cnblogs.com/wgyang/p/12686646.html
conseillé
Classement