Монго запрос с несколькими фильтрами на одном атрибуте не работает с JAVA - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в mongoDb и создал запрос, который удовлетворяет моим функциональным требованиям:

db.collection.find( 
{
    "typeD": "ABC"
    , "typeT": {$size: 2}
    , "typeT": { $all: ["def", "abc"] }
    , "typeC": { $size: 3}
    , "typeC": { $all: ["pdf", "video", "png"] }
    , "properties": {$size: 3}
    ,"properties": 
    {
        $all: 
        [
          {"$elemMatch": {"name": "propName1", "value": "proName1_value"} } 
        , {"$elemMatch": {"name": "propName2", "value": "proName2_value"} } 
        , {"$elemMatch": {"name": "propName3", "value": "proName3_value"} } 
        ]
    }   
);

Я хочу найти документы, которые точно содержат элементы, предоставленные массивами - как фиксированный порядокэлементы внутри массивов не могут быть приняты, я выбрал оператор $ all и для обеспечения точного соответствия добавил дополнительное ограничение с размером $.

Вышеупомянутый запрос может быть выполнен на оболочке mongo без проблем.

При попытке выполнить этот оператор с помощью Java с помощью mongoTemplate у меня возникают некоторые проблемы:

BasicQuery query = new BasicQuery(queryString);
CollectionEntity existingCmc = this.mongoTemplate.find(query, CollectionEntity.class);

После первой строки Java query.toString () предоставляет:

db.collection.find( 
{
    "typeD": "ABC"
    , "typeT": { $all: ["def", "abc"] }
    , "typeC": { $all: ["pdf", "video", "png"] }
    ,"properties": 
    {
        $all: 
        [
          {"$elemMatch": {"name": "propName1", "value": "proName1_value"} } 
        , {"$elemMatch": {"name": "propName2", "value": "proName2_value"} } 
        , {"$elemMatch": {"name": "propName3", "value": "proName3_value"} } 
        ]
    }   
);

Как мне выполнить запрос, который отвечает всем моим требованиям?Могу ли я переписать запрос так, чтобы в запросе было указано одно условие для каждого атрибута?Как я могу сказать mongoTemplate, чтобы он не «переписывал» предыдущее условие для этого атрибута?

Заранее спасибо

1 Ответ

0 голосов
/ 15 ноября 2018

Запросы MongoDB - это на самом деле Карты (пары ключ-значение) Поскольку вы определяете ключ 'properties' два раза, именно поэтому он переопределяется. Ваш желаемый запрос может быть выполнен с помощью оператора «$ and».

{ "$and": [ 
    { "properties": { "$size": 3 } }, 
    { "properties": { $all: 
        [
            {"$elemMatch": {"name": "propName1", "value": "proName1_value"} }, 
            {"$elemMatch": {"name": "propName2", "value": "proName2_value"} },
            {"$elemMatch": {"name": "propName3", "value": "proName3_value"} } 
        ] 
   } } 
] }
...