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" }
我如何 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" }