我不确定标题是否解释了我想说的内容。
但这里假设集合的结构是这样的;
[
{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]);
}
})
但是我没有发现这个效率,因为在查询之后,我遍历结果并将它们存储在新数组中。
是否有更好的方法只能通过查询获取alex
,elizabeth
,hannah
部分?
这只是一个例子。我想问你的建议,因为我有很多这样的情况。 (我正在寻找一种最有效的方法来修剪,更新集合中的一些值)
答案 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"
]
}
*/
});