Morphia — совместное использование hasAllOf и hasThisElement

У меня есть коллекция монго с именем «комментарий», в которой есть документы, имеющие структуру, подобную этой:

{
"_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.


person Pi Horse    schedule 11.02.2014    source источник
comment
возможный дубликат Morphia - запрос на основе вложенного документа   -  person evanchooly    schedule 12.02.2014
comment
@evanchooly: я уже решил это и закрыл это. Этот вопрос отличается тем, что он добавляет больше к предыдущему вопросу, и я хотел, чтобы оба вопроса были отдельными, поскольку я уже нашел решение для предыдущего.   -  person Pi Horse    schedule 12.02.2014
comment
Справедливо. Я просто четвертый раз вижу этот вопрос на разных форумах. :)   -  person evanchooly    schedule 12.02.2014
comment
Разве это не говорит о том, как мне трудно найти решение этой проблемы... :)   -  person Pi Horse    schedule 12.02.2014
comment
Не особенно, так как я уже ответил на одном из этих форумов.   -  person evanchooly    schedule 13.02.2014
comment
Ну, это был другой вопрос, и я думаю, что тогда я неправильно сформулировал вопрос. Текущий вопрос заключается в том, как выглядит моя проблема.   -  person Pi Horse    schedule 13.02.2014
comment
давайте продолжим это обсуждение в чате   -  person Pi Horse    schedule 13.02.2014