如何仅从数组中获取选定的对象
How to get selected object only from an array
我有一个包含以下结构的文档的集合:
{
"category": "movies",
"movies": [
{
"name": "HarryPotter",
"language": "english"
},
{
"name": "Fana",
"language": "hindi"
}
]
}
我想查询电影name="fana"
,响应应该是
{
"category": "movies",
"movies": [
{
"name": "HarryPotter",
"language": "english"
}
]
}
如何使用 spring mongoTemplate 获得上述内容?
$unwind of mongodb 聚合可用于此。
db.Collection.aggregate([{
{$unwind : 'movies'},
{$match :{'movies.name' : 'fana'}}
}])
您可以尝试上述查询以获得所需的输出。
你可以试试这个。
基于非聚合的方法:
public MovieCollection getMoviesByName() {
BasicDBObject fields = new BasicDBObject("category", 1).append("movies", new BasicDBObject("$elemMatch", new BasicDBObject("name", "Fana").append("size", new BasicDBObject("$lt", 3))));
BasicQuery query = new BasicQuery(new BasicDBObject(), fields);
MovieCollection groupResults = mongoTemplate.findOne(query, MovieCollection.class);
return groupResults;
}
基于聚合的方法:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.query.Criteria.where;
public List<BasicDBObject> getMoviesByName() {
Aggregation aggregation = newAggregation(unwind("movies"), match(where("movies.name").is("Fana").and("movies.size").lt(1)),
project(fields().and("category", "$category").and("movies", "$movies")));
AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(
aggregation, "movieCollection", BasicDBObject.class);
return groupResults.getMappedResults();
}
以上方法为您提供了使用聚合和基本查询的解决方案。但是如果你不想使用 BasicObject 下面的代码将完美地工作:
Query query = new Query()
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
List<Movies> movies = mongoTemplate.find(query, Movies.class);
此查询的缺点是它可能 return 出现在不同文档中的重复结果,因为可能有不止 1 个文档符合此条件。因此,您可以在条件中添加 _id,如下所示:
Criteria criteria = Criteria.where('_id').is(movieId)
Query query = new Query().addCriteria(criteria)
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
query.fields().exclude('_id')
List<Movies> movies = mongoTemplate.find(query, Movies.class);
我在响应中排除了文档的“_id”。
我有一个包含以下结构的文档的集合:
{
"category": "movies",
"movies": [
{
"name": "HarryPotter",
"language": "english"
},
{
"name": "Fana",
"language": "hindi"
}
]
}
我想查询电影name="fana"
,响应应该是
{
"category": "movies",
"movies": [
{
"name": "HarryPotter",
"language": "english"
}
]
}
如何使用 spring mongoTemplate 获得上述内容?
$unwind of mongodb 聚合可用于此。
db.Collection.aggregate([{
{$unwind : 'movies'},
{$match :{'movies.name' : 'fana'}}
}])
您可以尝试上述查询以获得所需的输出。
你可以试试这个。
基于非聚合的方法:
public MovieCollection getMoviesByName() {
BasicDBObject fields = new BasicDBObject("category", 1).append("movies", new BasicDBObject("$elemMatch", new BasicDBObject("name", "Fana").append("size", new BasicDBObject("$lt", 3))));
BasicQuery query = new BasicQuery(new BasicDBObject(), fields);
MovieCollection groupResults = mongoTemplate.findOne(query, MovieCollection.class);
return groupResults;
}
基于聚合的方法:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.query.Criteria.where;
public List<BasicDBObject> getMoviesByName() {
Aggregation aggregation = newAggregation(unwind("movies"), match(where("movies.name").is("Fana").and("movies.size").lt(1)),
project(fields().and("category", "$category").and("movies", "$movies")));
AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(
aggregation, "movieCollection", BasicDBObject.class);
return groupResults.getMappedResults();
}
以上方法为您提供了使用聚合和基本查询的解决方案。但是如果你不想使用 BasicObject 下面的代码将完美地工作:
Query query = new Query()
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
List<Movies> movies = mongoTemplate.find(query, Movies.class);
此查询的缺点是它可能 return 出现在不同文档中的重复结果,因为可能有不止 1 个文档符合此条件。因此,您可以在条件中添加 _id,如下所示:
Criteria criteria = Criteria.where('_id').is(movieId)
Query query = new Query().addCriteria(criteria)
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
query.fields().exclude('_id')
List<Movies> movies = mongoTemplate.find(query, Movies.class);
我在响应中排除了文档的“_id”。