查找包含子对象MongoDb和Node.js的特定字段的文档

时间:2016-04-03 20:39:28

标签: javascript node.js mongodb express

我有一个具有以下格式的集合:

[ 
  {
     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很陌生,似乎无法解决这个问题。

2 个答案:

答案 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'
        ]
    }
]