我的部分收藏如下:
# 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":[]
}
}
如何查询以正确包含和排除订单?
URL parameters: country=us&city=a
Expected result: Order1, Order2, Order3
URL parameters: country=us&city=x
Expected result: Order3
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
}
}]
}]
答案 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”,因此无需分区。