gpt4 book ai didi

javascript - Meteor 和 Mongo AND 标签过滤器

转载 作者:行者123 更新时间:2023-11-30 17:12:32 25 4
gpt4 key购买 nike

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

过滤逻辑如下:

  • 如果过滤器组为空则不按该过滤器组进行过滤
  • 如果选中过滤器组中的任何复选框,则应用该过滤器
  • $and 应该应用在过滤器组之间(如果选中 movies 和 R,那么应该只选择标签名为“!Movie”和“#free”的文档

我正在努力构建遵循上述逻辑的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com