select mongodb 中通过电子邮件发送的数据

select data by email in mongodb

我如何 select 通过用户集合中的 ID 发送电子邮件,如下所示:

select emailAddress from users where _id="***"

我 select 它在 mongo 中是这样的,但结果不正确

db.getCollection('users').find({_id: "QYoHQkTuTXnEC6Pws"},{ "emails.0.address": 1})

已更新:示例文件

{
  "_id": "QYoHQkTuTXnEC6Pws",
  "createdAt": ISODate("2017-03-09T06:21:29.664Z"),

  "emails": [{
    "address": "x@gmail.com",
    "verified": true
  }],
  "isDeleted": false
}

查看您的查询,您预计只会找到第一封电子邮件和给定 ID 的地址字段。根据预期的输出,您可以尝试以下查询并选择。


会给你所有地址

db.users.find({_id:'QYoHQkTuTXnEC6Pws'}, { "emails.address": 1})

回应

{
    "_id" : "QYoHQkTuTXnEC6Pws",
    "emails" : [ 
        {
            "address" : "x@gmail.com"
        }, 
        {
            "address" : "x2@gmail.com"
        }
    ]
}

只会给你数组中的第一个电子邮件地址。您已明确删除所有其他字段

db.users.find({_id:'QYoHQkTuTXnEC6Pws'}, 
   { 'emails.verified':0,  _id:0, createdAt: 0, isDeleted: 0, "emails": {$slice: 1}})

回应

{
    "emails" : [ 
        {
            "address" : "x@gmail.com"
        }
    ]
}

或者,您可以使用聚合来获得预期结果

db.users.aggregate({$match: {_id:'QYoHQkTuTXnEC6Pws'}}, 
   {$project: {_id:0,email: {$arrayElemAt: ['$emails.address',0]}}})

回应 {"email" : "x@gmail.com"}

我得到了你的要求的答案;

db.inventory.aggregate([{
  $match: {
    _id: "QYoHQkTuTXnEC6Pws"
  }
}, {
  $unwind: "$emails"
}, {
  $replaceRoot: {
    newRoot: "$emails"
  }
}, {
  $project: {
    address: 1
  }
}])

这将首先匹配正确的文档,然后 $unwinds emails 字段以公开内部对象,然后将根移动到它以使焦点靠近 address 字段,然后$project 只得到 address,这是您的示例数据的结果(如果它包含多封电子邮件);

{ "address": "x@gmail.com" }
{ "address": "xy@gmail.com" }