在同一属性上具有多个过滤器的Mongo查询不适用于JAVA

时间:2018-11-12 13:10:05

标签: java mongodb mongotemplate

我是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运算符,并确保精确匹配以增加其他限制与$ size。

以上查询可以在mongo shell上执行,没有任何问题。

当尝试使用mongoTemplate使用Java执行此语句时,出现一些问题:

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 :(得分:0)

MongoDB查询实际上是Map(键-值对)。 由于您两次定义了“属性”键,因此它被覆盖了。 您可以使用“ $ 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"} } 
        ] 
   } } 
] }