如何在mongoDB中获取电子邮件abc@gmail.com的数据?我不知道密钥名称,我想遍历所有数据。
我有这样的数据:
{
"_id":"5c0a1589a5a41b2ae707317b",
"test1":{
"email":"abc@gmail.com",
"phoneNo":"123456897",
"endpointId":"test1"
}
}
{
"_id":"5c0a1989a5a41b2ae807317b",
"test2":{
"email":"abc@gmail.com",
"phoneNo":"123456897",
"endpointId":"test2"
}
}
{
"_id":"5c0a1989a5a41b2ae807317b",
"test2":{
"email":"pqr@gmail.com",
"phoneNo":"123456897",
"endpointId":"test3"
}
}
但是在搜索时不知道对象键。我想遍历所有数据并获得具有特定电子邮件的匹配数据。
如果我知道test1、test2等键名,那么我可以使用find({test1:{…}})
,但在这里我不知道键值。
那么,我该怎么做呢?
您可以在mongoDB 3.4及更高版本中使用$object tToArray
使用下面的聚合
db.collection.aggregate([
{ "$addFields": {
"field": { "$objectToArray": "$$ROOT" }
}},
{ "$match": { "field.v.email": "abc@gmail.com" }},
{ "$project": { "field": 0 }}
])
我假设您获得数组类型的对象。
我做了一个名为findObject
的方法。此方法将获取对象数组和所需的电子邮件。
最后,返回与电子邮件匹配的第一个对象。
const data = [{
"_id":"5c0a1589a5a41b2ae707317b",
"test1":{
"email": "abc@gmail.com",
"phoneNo": "123456897",
"endpointId":"test1"
}
},
{
"_id":"5c0a1989a5a41b2ae807317b",
"test2":{
"email": "abc@gmail.com",
"phoneNo": "123456897",
"endpointId":"test2"
}
},
{
"_id":"5c0a1989a5a41b2ae807317b",
"test2":{
"email": "pqr@gmail.com",
"phoneNo": "123456897",
"endpointId": "test3"
}
}];
const findObject = (data, email) => {
for (let index=0; index<data.length; index++) {
const currentData = data[index];
for (let property in currentData) {
if (property != '_id' && currentData[property].email == email) {
return currentData;
}
}
}
return null;
}
let desiredObject;
const desiredEmail = 'abc@gmail.com';
desiredObject = findObject(data, desiredEmail);
console.log(desiredObject);
输出将是
{ _id: '5c0a1589a5a41b2ae707317b',
test1:
{ email: 'abc@gmail.com',
phoneNo: '123456897',
endpointId: 'test1' } }
我认为你不能对完全未知的字段进行查询!如果你可以更改你的模式,请参阅此处了解更多信息,你也可以编写脚本以使用新模式迁移到新DB:
// new doc instance
{
"_id":"5c0a1589a5a41b2ae707317b",
"obj": {
"name": "test1"
"email":"abc@gmail.com"
"phoneNo":"123456897",
"endpointId":"test1"
}
},
{
"_id":"5c0a1989a5a41b2ae807317b",
"obj": {
"name": "test2"
"email":"abc@gmail.com"
"phoneNo":"123456897",
"endpointId":"test2"
}
},
{
"_id":"5c0a1989a5a41b2ae807317b",
"obj": {
"name": "test3"
"email":"pqr@gmail.com"
"phoneNo":"123456897",
"endpointId":"test3"
}
}
否则,检查这可能工作正确。如果所有这些都无效,则进行查询以将所有数据作为Array
获取并在其上使用filter
方法:
Model.find({}, (err, docs) => {
const result = docs.filter((doc) => {
for (key in doc) {
if (doc[key].email === 'abc@gmail.com')
return doc;
}
});
console.log(result);
});