我有一个具有以下格式的集合:
[
{
firstname: 'Joe',
lastname: 'Blow',
emails: [
{
email: 'test@example.com',
valid: false
},
{
email: 'test2@example.com',
valid: false
}
],
password: 'abc123',
_id: 57017e173915101e0ad5d94a
},
{
firstname: 'Johnny',
lastname: 'Doe',
emails: [
{
email: 'test3@example.com',
valid: false
}
],
password: 'abc123',
_id: 57017e173915101e0ad5d87b
},
]
我正在尝试根据emails.email
字段找到用户。以下是我到目前为止的情况:
db.collection('users').aggregate([
{$unwind: "$emails"},
{$group: {_id: "$_id",user_emails: { $push: "$emails.email" } } },
{$match: {'user_emails': { $in: ['test@example.com'] } } }
],
(error, result) => {
console.log(error);
console.log(result);
}
);
当我在mongo shell中运行此命令时,它似乎工作;但是,当我在Node.js
中运行时,会为错误打印null
,为结果打印[]
。
我做错了什么?我对MongoDB
很陌生,似乎无法解决这个问题。
答案 0 :(得分:2)
为什么要放松整个电子邮件?当你的收藏增长了大量的记录时,这将是一个非常昂贵的操作。
以下查询将返回电子邮件test2@example.com的用户。我认为那就是你想要的吗?
db.email.find({emails :{$elemMatch:{email:"test2@example.com"}}})
答案 1 :(得分:0)
我重新编写了您的代码,稍作修改。
var col = db.collection('collection');
if (col) {
col.aggregate([
{$unwind: "$emails"},
{$group: {_id: "$_id",user_emails: { $push: "$emails.email" } } },
{$match: {'user_emails': { $in: ['test@example.com'] } } }
], function(e, r){
if(e){
console.log(error);
}
console.log(r);
db.close();
});
}
如果您已成功建立连接和其他要求,它应该可以工作。提供样本文件后,它会发出:
[
{
_id: '57017e173915101e0ad5d94a',
user_emails: [
'test@example.com',
'test2@example.com'
]
}
]