- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Meteor 应用程序,其中我有一个带有标签字段的 mongo 集合。
[{name: "ABC", tags: {"@Movie", "#free", "!R"}},
{name: "DEF", tags: {"@Movie", "!PG"}},
{name: "GHI", tags: {"@Sports", "#free"}}]
在我的 UI 上,根据标签名称的第一个字母动态填充了三组复选框。
filter group 1: [ ]Movie [ ] Sports
filter group 2: [ ]free
filter group 3: [ ]PG [ ]R
过滤逻辑如下:
我正在努力构建遵循上述逻辑的 mongo 标准参数。我的代码目前看起来像带有很多嵌套 if 的意大利面条(在伪代码中)
if (filter_group1 为空) then if (filter_group2 为空) then mongo_criteria= {_id: $in: $("input:checked", ".filtergroup1").map(function() {return this.value} )}
这样做的正确方法是什么?
最佳答案
首先,我确定您的意思是“标签”实际上是一个数组,否则该结构将无效:
{ "name": "ABC", "tags": ["@Movie", "#free", "!R"]},
{ "name": "DEF", "tags": ["@Movie", "!PG"]},
{ "name": "GHI", "tags": ["@Sports", "#free"]}
以这种方式存储“标签”数据是一个新颖的想法,但看起来您构建查询的程序逻辑需要意识到在 $and
中至少需要考虑“三个”可能的条件组合。
在最简单的形式中,您只允许每个过滤器组选择一个,那么您可以使用 $all
运算符来解决这个问题。为简洁起见,仅使用简单的 MongoDB shell 表示法:
db.collection.find({ "tags": { "$all": [ "@Movie", "!R" ] } })
问题是,如果你想对一个组进行多项选择,例如评级,那么这将无法得到结果:
db.collection.find({ "tags": { "$all": [ "@Movie", "!R", "!PG" ] } })
实际上没有项目包含这两个评级值,因此这将是无效的。所以你宁愿这样做:
db.collection.find({ "$and": [
{ "tags": { "$in": [ "@Movie" ] } },
{ "tags": { "$in": [ "!R", "!PG" ] } }
])
这将正确匹配所有带有“R”和“PG”评级标签的电影。将此扩展到另一个组基本上是将另一个数组项推送到 $and
表达式:
db.collection.find({ "$and": [
{ "tags": { "$in": [ "@Movie" ] } },
{ "tags": { "$in": [ "!R", "!PG" ] } },
{ "tags": { "$in": [ "#free" ] }
])
仅获取包含匹配值的每个“类型”过滤器的文档,因此“PG”电影不是免费的,“Sports”通过不添加到选择中而被过滤掉。
构造查询的基础是在每个筛选器组中使用一系列用于 $in
的选择选项。当然,只有当您的过滤器组中存在一个选择时,您才附加到 $and
数组。
所以从像这样的基础 $and
开始:
var query = { "$and":[{}] };
然后将每个过滤器组中的每个选中的选项添加到它自己的中:
var inner = { "tags": { "$in": [] } };
inner.tags["$in"].push( item );
然后附加到基本查询:
query["$and"].push( inner );
冲洗并重复每件元素。这是完全有效的,因为基本查询将只选择所有未过滤的内容,这在没有构建额外逻辑的情况下也是有效的:
db.collection.find({ "$and": [
{ },
{ "tags": { "$in": [ "@Movie" ] } },
{ "tags": { "$in": [ "!R", "!PG" ] } },
{ "tags": { "$in": [ "#free" ] }
])
所以它真的归结为 MongoDB 理解的查询构造。这实际上只是构建数据结构时简单的 JavaScript 数组操作。这就是所有 MongoDB 查询的真正含义。
关于javascript - Meteor 和 Mongo AND 标签过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26706510/
我是一名优秀的程序员,十分优秀!