Java MongoDB通过命令中的$get获得匹配数 定义
我正在创建搜索应用程序,mongo db用于存储搜索信息。这是集合“资源”的示例数据集 它包含书籍的名称和每本书中最常用的单词(在关键字数组中)。我正在使用spring框架和mongo模板。如果我在代码下面运行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"
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-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模板查询?