Reputation: 242
I am using spring and mongo for API developemt with the following document structure:
Document-1
myId:1
array:['abc','jkl','xyz']
Document-2
myId:3
array:['qwe','mnp','xyz']
Document-3
myId:3
array:['ped','abc','xyz']
My url : localhost:8080/array=xyz
expected : document-1,document-2,document-3
My url: localhost:8080/array=xyz,abc
exoected: document-1,document-3
In short I want all the documents in result which contains all the comma separated array
variable.
Is there ary inbuild support that spring provides for this like @Query annotation?
Or How can I acheive this?
Upvotes: 13
Views: 23090
Reputation: 103445
You essentially want to use the $all
operator to get the desired results. In the mongo shell, the following operation will bring the documents:
Populate test collection
db.test.insert([
{
_id: 1,
myId: 1,
array: ['abc','jkl','xyz']
},
{
_id: 2,
myId: 3,
array: ['qwe','mnp','xyz']
},
{
_id: 3,
myId: 3,
array:['ped','abc','xyz']
}
])
Run operations
> db.test.find({"array": { "$all": ["xyz"] }})
{ "_id" : 1, "myId" : 1, "array" : [ "abc", "jkl", "xyz" ] }
{ "_id" : 2, "myId" : 3, "array" : [ "qwe", "mnp", "xyz" ] }
{ "_id" : 3, "myId" : 3, "array" : [ "ped", "abc", "xyz" ] }
> db.test.find({"array": { "$all": ["abc", "xyz"] }})
{ "_id" : 1, "myId" : 1, "array" : [ "abc", "jkl", "xyz" ] }
{ "_id" : 3, "myId" : 3, "array" : [ "ped", "abc", "xyz" ] }
As with the @Query
annotation in Spring Data MongoDB, I haven't tested this but you may want to try the following custom query implementation example
@Document(collection="test")
class Test {
int myId;
String[] array;
}
public interface TestRepository extends MongoRepository<Test, Integer> {
@Query(value = "{ 'array' : {$all : [?0] }}")
public List<Test> findAnyOfTheseValues(String[] arrayValues);
}
If the above doesn't work for you, you may want to create a custom interface and your implementation class to execute the custom query. For example, create an interface with a name that appends Custom:
public interface TestRepositoryCustom {
public List<Test> findAnyOfTheseValues(String[] arrayValues);
}
Modify the TestRepository
and add the TestRepositoryCustom
interface to be extended:
@Repository
public interface TestRepository extends TestRepositoryCustom, MongoRepository {
}
Create your implementation class to implement the methods defined in TestRepositoryCustom
interface.
public class TestRepositoryImpl implements TestRepositoryCustom {
@Autowired
MongoTemplate mongoTemplate;
@Override
public List<Test> findAnyOfTheseValues(String[] arrayValues) {
return mongoTemplate.find(
Query.query(Criteria.where("array").all(arrayValues)), Test.class);
}
}
Upvotes: 13