Mongodb 使用聚合遍历集合

Mongodb use aggregate to iterate through collection

我有一个名为 collectionname 的摘要集和一个名为 keywords 的关键字列表。 我使用下面的代码过滤掉 collectionname 中包含列表中第一个关键字的所有摘要,效果很好。

db.collectioname.aggregate([ { $match: { summary: {$regex: keywords[1], $options:"i"} } }, { $out: "subsetfinal" } ]);

但是当我开始循环它时,它给了我聚合错误。我真的想不通为什么。

for (var i = 0; i < 79; i++) {db.collectioname.aggregate([ { $match: { summary: {$regex: keywords[i], $options:"i"} } }, { $out: "subsetfinal" } ])}; 

它给我错误:

$regex 必须是字符串
代码 16810

有人能帮忙吗?

尝试使用 forEach:

keywords.forEach(function(keyword)
 { 
    db.collectioname.aggregate([ { $match: { summary: {$regex: keyword, $options:"i"} } }, { $out: "subsetfinal" } ])
});

您可以使用管道分隔的正则表达式模式和如下关键字:

测试文档:

db.collectioname.insert([
    { summary: "a b c" },
    { summary: "d e f" },
    { summary: "g h i" },
    { summary: "j k l" },
    { summary: "m n o" }
]);

魔法:

var keywords = ["a", "d", "j"],
    regex = keywords.join("|");

db.collectioname.aggregate([ 
    { 
        "$match": { 
            "summary": {
                "$regex": regex, 
                "$options": "i"
            } 
        } 
    }, 
    { "$out": "subsetfinal" } 
]);

查询:

db.subsetfinal.find({}, {_id:0})

给予

/* 0 */
{
    "summary" : "a b c"
}

/* 1 */
{
    "summary" : "d e f"
}

/* 2 */
{
    "summary" : "j k l"
}