Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB通过命令中的$get获得匹配数 定义_Java_Mongodb_Spring Mongodb - Fatal编程技术网

Java MongoDB通过命令中的$get获得匹配数 定义

Java MongoDB通过命令中的$get获得匹配数 定义,java,mongodb,spring-mongodb,Java,Mongodb,Spring Mongodb,我正在创建搜索应用程序,mongo db用于存储搜索信息。这是集合“资源”的示例数据集 它包含书籍的名称和每本书中最常用的单词(在关键字数组中)。我正在使用spring框架和mongo模板。如果我在代码下面运行 MongoOperations mongoOperations = new MongoTemplate(new MongoClient("127.0.0.1", 27017), "ResourceDB"); Query query = new Query(where("keywords"

我正在创建搜索应用程序,mongo db用于存储搜索信息。这是集合“资源”的示例数据集

它包含书籍的名称和每本书中最常用的单词(在关键字数组中)。我正在使用spring框架和mongo模板。如果我在代码下面运行

MongoOperations mongoOperations = new MongoTemplate(new MongoClient("127.0.0.1", 27017), "ResourceDB");
Query query = new Query(where("keywords").in("java", "thread", "sleep"));
List<Resource> resources = mongoOperations.find(query, Resource.class);
MongoOperations-MongoOperations=newmongotemplate(newmongoclient(“127.0.0.1”,27017),“ResourceDB”);
查询查询=新查询(其中(“关键字”)。在(“java”、“线程”、“睡眠”);
List resources=mongoOperations.find(查询,Resource.class);
它的结果是“高级Java”和“简单Java”以及它的ok

问题 但就我而言,我需要它们。因为“简单Java”匹配3个单词,“高级Java”只匹配2个单词。所以,最相关的书应该是《简单的Java》,而且应该放在第一位

预期订单

  • 简单语言中的Java
  • 高级Java
是否可以按匹配顺序获得结果。或者是否有任何方法可以获得每个项目的匹配数。例如,如果是搜索(“java”、“线程”、“睡眠”),我希望得到如下输出

  • 高级Java-2匹配
  • 简单3匹配中的Java

感谢您的帮助。

$in与3或2项不匹配。它在第一场比赛后停止。您需要使用聚合管道从查询中计算关键字和数组的数量,并按结果的大小排序:

db.collection.aggregate([
    { $addFields: {
        matchedTags: { $size: { 
            $setIntersection: [ "$keywords", [ "java", "thread", "sleep" ] ] 
        } }
    } },
    { $match: { matchedTags: { $gt: 0 } } },
    { $sort: { matchedTags: -1 } }
])

$in与3或2项不匹配。它在第一场比赛后停止。您需要使用聚合管道从查询中计算关键字和数组的数量,并按结果的大小排序:

db.collection.aggregate([
    { $addFields: {
        matchedTags: { $size: { 
            $setIntersection: [ "$keywords", [ "java", "thread", "sleep" ] ] 
        } }
    } },
    { $match: { matchedTags: { $gt: 0 } } },
    { $sort: { matchedTags: -1 } }
])

这是为那些希望用java运行@Alex Blex查询的人准备的。看起来mongo模板没有交叉点的实现。因此,我使用mongoDB java客户端完成了这项工作

List<String> keywords = Arrays.asList("java", "thread", "sleep");
BasicDBList intersectionList = new BasicDBList();
intersectionList.add("$keywords");
intersectionList.add(keywords);

AggregateIterable<Document> aggregate = new MongoClient("127.0.0.1", 27017).getDatabase("ResourceDB").getCollection("Resource").aggregate(
            Arrays.asList(
                    new BasicDBObject("$addFields",
                            new BasicDBObject("matchedTags",
                                    new BasicDBObject("$size",
                                            new BasicDBObject("$setIntersection", intersectionList)))),
                    new BasicDBObject("$match",
                            new BasicDBObject("matchedTags",
                                    new BasicDBObject("$gt", 0))),
                    new BasicDBObject("$sort",
                            new BasicDBObject("matchedTags", -1))
            )
    );
 MongoCursor<Document> iterator = aggregate.iterator();
 while (iterator.hasNext()){
        Document document = iterator.next();
        System.out.println(document.get("name")+" - "+document.get("matchedTags"));
 }
List关键字=Arrays.asList(“java”、“线程”、“睡眠”);
BasicDBList intersectionList=新的BasicDBList();
intersectionList.add(“$keywords”);
intersectionList.add(关键字);
AggregateItableAggregate=新的MongoClient(“127.0.0.1”,27017).getDatabase(“ResourceDB”).getCollection(“Resource”).aggregate(
Arrays.asList(
新的BasicDBObject($addFields),
新的BasicDBObject(“matchedTags”,
新的BasicDBObject($size),
新的BasicDBObject(“$setIntersection”,intersectionList)),
新的BasicDBObject($match),
新的BasicDBObject(“matchedTags”,
新的基本对象(“$gt”,0)),
新的BasicDBObject(“$sort”,
新的基本目标(“匹配标记”,-1))
)
);
MongoCursor迭代器=aggregate.iterator();
while(iterator.hasNext()){
Document=iterator.next();
System.out.println(document.get(“name”)+“-”+document.get(“matchedTags”);
}

这是为那些希望在java中运行@Alex Blex查询的人准备的。看起来mongo模板没有交叉点的实现。因此,我使用mongoDB java客户端完成了这项工作

List<String> keywords = Arrays.asList("java", "thread", "sleep");
BasicDBList intersectionList = new BasicDBList();
intersectionList.add("$keywords");
intersectionList.add(keywords);

AggregateIterable<Document> aggregate = new MongoClient("127.0.0.1", 27017).getDatabase("ResourceDB").getCollection("Resource").aggregate(
            Arrays.asList(
                    new BasicDBObject("$addFields",
                            new BasicDBObject("matchedTags",
                                    new BasicDBObject("$size",
                                            new BasicDBObject("$setIntersection", intersectionList)))),
                    new BasicDBObject("$match",
                            new BasicDBObject("matchedTags",
                                    new BasicDBObject("$gt", 0))),
                    new BasicDBObject("$sort",
                            new BasicDBObject("matchedTags", -1))
            )
    );
 MongoCursor<Document> iterator = aggregate.iterator();
 while (iterator.hasNext()){
        Document document = iterator.next();
        System.out.println(document.get("name")+" - "+document.get("matchedTags"));
 }
List关键字=Arrays.asList(“java”、“线程”、“睡眠”);
BasicDBList intersectionList=新的BasicDBList();
intersectionList.add(“$keywords”);
intersectionList.add(关键字);
AggregateItableAggregate=新的MongoClient(“127.0.0.1”,27017).getDatabase(“ResourceDB”).getCollection(“Resource”).aggregate(
Arrays.asList(
新的BasicDBObject($addFields),
新的BasicDBObject(“matchedTags”,
新的BasicDBObject($size),
新的BasicDBObject(“$setIntersection”,intersectionList)),
新的BasicDBObject($match),
新的BasicDBObject(“matchedTags”,
新的基本对象(“$gt”,0)),
新的BasicDBObject(“$sort”,
新的基本目标(“匹配标记”,-1))
)
);
MongoCursor迭代器=aggregate.iterator();
while(iterator.hasNext()){
Document=iterator.next();
System.out.println(document.get(“name”)+“-”+document.get(“matchedTags”);
}

此查询满足我的需要,但如何将其转换为spring mongo模板查询?此查询满足我的需要,但如何将其转换为spring mongo模板查询?