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

Find documents that contain certain field for sub-object MongoDb and Node.js

本文关键字:字段 文档 js Node 包含 对象 MongoDb 查找      更新时间:2023-12-08

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

[ 
  {
     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的新手,只是似乎不明白这一点。

为什么要打开整个电子邮件?当你的收藏随着大量记录的增长而增长时,这将是一项非常昂贵的操作。

以下查询将向用户返回电子邮件test2@example.com.我想这就是你想要的,对吧?

db.email.find({emails :{$elemMatch:{email:"test2@example.com"}}})

我重新编写了您的代码,并做了一些更改。

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