是否有可能更新查询中的集合中的值?

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

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

[ {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查询?

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

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

 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" ] } */ });