【问题标题】:user regex in $nin mongo在 $nin mongodb 中使用正则表达式
【发布时间】:2018-05-31 21:03:04
【问题描述】:

我无法在聚合中使用以下正则表达式。我读了很多例子,但它不起作用。我想要的是排除具有 3 个或更少字符的单词(例如:1 a2 aaa a-)。但是它们仍然出现。

这是我的正则表达式(我认为它是正确的)\b\w?\w?\w?\b

这里是聚合:

Meteor.publish("topics", function () {
  ReactiveAggregate(this, Articles, [
    {
      $project: {
              topic: { $split: ["$title", " "] },

              article: "$$ROOT"
      }
    },
    {
      $unwind: {
              path: "$topic"
      }
    },
    {
      $match: {
              topic: { $nin: ["sports", "\b\w?\w?\w?\b"] }
      }
    },
    {
      $group: {
              _id: "$topic",
              count: { $sum: 1 },
              articles: { $push: "$article" }
      }
    }
  ], { clientCollection: "clientTopic" });
});

例子:

    /* Article 1 */
{
    "_id" : "SB4mKAxaBijQXnS73",
    "title" : "Messi signs new contract with Barcelona"
}
/* Article 2 */
{
     "_id" : "rhqioBkePzGCrRFLp",
     "title" : "Messi has 30 years old"
 }
/* Article 3 */
{
      "_id" : "X6LochRZw32op39W8",
      "title" : "President of Argentina visits Messi"
}

我想得到一个像这样的集合:

Messi ==> {_id: "Messi", articles: [Article 1, Article 2, Article 3], count: 3 }
signs ==> {_id: "signs", articles: [Article 1], count: 1 }
contract ==> {_id: "contract", articles: [Article 1], count: 1 }
with ==> {_id: "with", articles: [Article 1], count: 1 }
Barcelona  ==> {_id: "Barcelona", articles: [Article 1], count: 1 }

years  ==> {_id: "years", articles: [Article 2], count: 1 }

President  ==> {_id: "President", articles: [Article 3], count: 1 }
Argentina  ==> {_id: "Argentina", articles: [Article 3], count: 1 }
visits     ==> {_id: "visits", articles: [Article 3], count: 1 }

如您所见,newhas30oldof 这些词不应出现,因为它们的长度为 3 个字符或更少。

标题中带有sports字样的文章不包含在集合中,但匹配正则表达式的文章是包含。

【问题讨论】:

  • 您能否举例说明应该包含的文档和应该排除的文档?这将使查询条件实际上应该是什么更清楚。
  • 反正这个正则表达式看起来是错误的。应该是/\b\w{3}\b/
  • @NeilLunn 我编辑了我的第一篇文章,添加了一个示例。我想消除“噪音”或“停止”词(the、in、an、a、it 等),否则它们将始终排在首位。
  • @NeilLunn 为什么?只需添加示例来表示哪些文档应该出现在集合中。我将正则表达式更改为您所说的,但该词仍然出现。好像什么都不匹配。
  • 老兄。你想要一个$text 搜索而不使用$split 或任何一个。 MongoDB 已经做到了这一点,因此您无需重新发明它。

标签: mongodb meteor aggregation-framework


【解决方案1】:

数组中的每个元素在单词前面都带有 ^,例如['^work', '^accus', '^planet']

var words = [/hello/, /^world/];// 正则表达式数组 db.getCollection('word collection').find({"word" : {$in : words}});

【讨论】:

  • 你说我应该在正则表达式之前加上 ^ ?我这样做是这样的:{ $match: { topic: { $nin: ["sports", "^\b\w?\w?\w?\b"] } } }, 但仍然在集合中获得这些词。
【解决方案2】:

如果要排除长度为 3 或小于 3 的单词,则可以使用 /\w{4,}/

Meteor.publish("topics", function () {
  ReactiveAggregate(this, Articles, [
    {
      $project: {
              topic: { $split: ["$title", " "] },

              article: "$$ROOT"
      }
    },
    {
      $unwind: {
              path: "$topic"
      }
    },
    {
      $match: {
              topic: { $nin: ["sports", "\w{4,}"] }
      }
    },
    {
      $group: {
              _id: "$topic",
              count: { $sum: 1 },
              articles: { $push: "$article" }
      }
    }
  ], { clientCollection: "clientTopic" });
});

您可以使用此链接测试正则表达式https://regex101.com/

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2011-11-30
    • 2020-09-14
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2022-07-28
    • 2016-03-02
    相关资源
    最近更新 更多