У меня есть коллекция монго с именем «комментарий», в которой есть документы, имеющие структуру, подобную этой:
{
"_id" : ObjectId("9873214jkhdkfjdsf8324"),
"nm" : "test",
"sts" : 1,
"updby" : NumberLong(0),
"tags" : [
{
"name" : "women",
"rank" : 1,
"type" : 3
},
{
"name" : "men",
"rank" : 1
},
{
"name" : "clothing",
"rank" : 2,
"type" : 1
}
]
Я хочу запросить коллекцию с помощью запроса монго, который будет выглядеть так:
db.comment.find({"tags":{
$all:[
{"$elemMatch":{"name" : "women", "type" : 3}},
{"$elemMatch":{"name" : "clothing"}}
]}
})
Количество вложенных документов, которые я сопоставляю внутри «тегов», будет переменным. В приведенном выше запросе я пытаюсь сопоставить 2 набора комбинаций.
Вот что я пробовал до сих пор:
TagsDo tag = new TagsDo("women", null, 3);
Query<CommentDo> t =
getMongoDAORead().getDatastore()
.createQuery(CommentDoImpl.class)
.field("tags").hasThisElement(tag).disableValidation();
Это сформирует следующий запрос монго:
{"ctags":{"$elemMatch":{"name":"women","type":3}}}
Теперь, чтобы иметь более одной комбинации, я пытаюсь создать список TagsDo:
List<TagsDo> tag = new ArrayList<TagsDo>();
TagsDo tag1 = new TagsDo("women", null, 3);
TagsDo tag2 = new TagsDo("clothing", null, 1);
Query<CommentDo> t =
getMongoDAORead().getDatastore()
.createQuery(CommentDoImpl.class)
.field("tags").hasThisElement(Arrays.asList(tag.toArray)).disableValidation();
Это формирует следующий запрос монго:
{ "ctags" :
{ "$elemMatch" : [ { "className" : "com.dal.comments.TagsDo" , "name" : "handbags" , "type" : 3} ,
{ "className" : "com.dal.comments.TagsDo" , "name" : "web" , "type" : 0}]}}
У меня есть одна проблема выше,
-> 'elemMatch' должен появиться дважды, а не только один раз.
После этого мне нужно использовать hasAllOf, который добавит в запрос ключевое слово $allll.