如何在MongoDB中结合包含和排除功能?

时间:2016-02-24 21:38:18

标签: mongodb mongodb-query

我的部分收藏如下:

# Order1 
{
 "countries": [
  {
    "code":"us"
  }
 ],
 "cities": {
  "includes":["a", "b"],
  "excludes":[]
 }
}


# Order2 
{
 "countries": [
  {
    "code":"all"
  }
 ],
 "cities": {
  "includes":["all"],
  "excludes":["x"]
 }
}

# Order3
{
 "countries": [
  {
    "code":"all"
  }
 ],
 "cities": {
  "includes":["all"],
  "excludes":[]
 }
}

如何查询以正确包含和排除订单?

示例1:

URL parameters: country=us&city=a 
Expected result: Order1, Order2, Order3

示例2:

URL parameters: country=us&city=x
Expected result: Order3

示例3:

URL parameters: country=de&city=z
Expected result: Order2, Order3

我尝试过的一件事情与此相似:

           $and: [{
                    $or: [{
                        'countries.code': 'all'
                    }, {
                        'countries.code': URL_PARAMETER_FOR_COUNTRY
                    }]
                }, {
                $and: [{
                        $or: [{
                            'cities.includes': 'all'
                        }, {
                            'cities.includes': URL_PARAMETER_FOR_CITY
                        }]
                    },

                    {
                        'cities.excludes': {
                            $ne: URL_PARAMETER_FOR_CITY
                        }
                    }]

            }]

1 个答案:

答案 0 :(得分:0)

我认为你基本上是在正确的轨道上,但你对逻辑的“嵌套”和$and等运营商的使用感到困惑。 所有 MongoDB查询参数已经为“AND *条件,因此通常无需指定此内容。

此外,当您在完全相同的字段上有$or的多个条件时,使用$in编写此条件会更加清晰:

db.collection.find({
    "countries.code": { "$in": ["all",COUNTRY_PARAM] },
    "cities.includes": { "$in": ["all",CITY_PARAM] },
    "cities.excludes": { "$ne": CITY_PARAM }
})

即使您想要对“排除”的“多重”测试进行滚动,例如“全部”值,也只需应用“{非等效”列表$nin

db.collection.find({
    "countries.code": { "$in": ["all",COUNTRY_PARAM] },
    "cities.includes": { "$in": ["all",CITY_PARAM] },
    "cities.excludes": { "$nin": ["all",CITY_PARAM }
})

符合返回匹配文档的所有描述组合。

查询参数是一个“AND”条件而没有指定它的原因是因为通常这是人们的意思,因此它使表达式比简洁表示简化得多,而且更不容易混淆。

AND与AND表示所有条件下的“AND”,因此无需分区。