是否可以在查询中更新集合中的值?

时间:2017-01-25 07:31:39

标签: node.js mongodb mongodb-query aggregation-framework

我不确定标题是否解释了我想说的内容。

但这里假设集合的结构是这样的;

[
    {email: "alex@sda.com"},
    {email: "elizabeth@sds.com"},
    {email: "hannah@xx.com"},
]

我希望在@字符之前收到电子邮件。

我做了什么来实现这个目标?

db.collection.find({}).toArray(function(err, result){
    var emails = [];    
    for(var i =0; i< result.length; i++){
         emails.push(result[i].split("@")[0]);
    }
})

但是我没有发现这个效率,因为在查询之后,我遍历结果并将它们存储在新数组中。

是否有更好的方法只能通过查询获取alexelizabethhannah部分?

这只是一个例子。我想问你的建议,因为我有很多这样的情况。 (我正在寻找一种最有效的方法来修剪,更新集合中的一些值)

1 个答案:

答案 0 :(得分:1)

您可以先使用 distinct 方法获取电子邮件地址列表,然后使用正则表达式获取名称:

db.collection.distinct("email", function(err, result){
    var emails = result.map(function(email){
        return email.match(/^([^@]*)@/)[1];
    });
    console.log(emails);
});

使用聚合框架,MongoDB 3.4有一个 $split 运算符,您可以将其与 $arrayElemAt 结合使用:

db.collection.aggregate([
    {
        "$group": {
            "_id": null,
            "emails": {
                "$push": {
                    "$arrayElemAt": [
                        { "$split": ["$email", "@"] },
                        0
                    ]
                }
            }
        }
    }   
], function(err, result){
    if (err) throw err;
    console.log(result);
    /*
        {
            "_id" : null,
            "emails" : [ 
                "alex", 
                "elizabeth", 
                "hannah"
            ]
        }   
    */
});