【发布时间】: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 }
如您所见,new、has、30、old、of 这些词不应出现,因为它们的长度为 3 个字符或更少。
标题中带有sports字样的文章不包含在集合中,但匹配正则表达式的文章是包含。
【问题讨论】:
-
您能否举例说明应该包含的文档和应该排除的文档?这将使查询条件实际上应该是什么更清楚。
-
反正这个正则表达式看起来是错误的。应该是
/\b\w{3}\b/ -
@NeilLunn 我编辑了我的第一篇文章,添加了一个示例。我想消除“噪音”或“停止”词(the、in、an、a、it 等),否则它们将始终排在首位。
-
@NeilLunn 为什么?只需添加示例来表示哪些文档应该出现在集合中。我将正则表达式更改为您所说的,但该词仍然出现。好像什么都不匹配。
-
老兄。你想要一个
$text搜索而不使用$split或任何一个。 MongoDB 已经做到了这一点,因此您无需重新发明它。
标签: mongodb meteor aggregation-framework