在mongodb中查找密钥何时未知



如何获取电子邮件为的数据abc@gmail.com在mongoDB中?我不知道密钥名称,我想遍历所有数据。

我有这样的数据:

{
"_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:{...}}),但这里我不知道键值。

那么,我该怎么做呢?

您可以在mongodb3.4及以上中使用$objectToArray进行以下聚合

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

我认为您不能对完全未知的字段进行查询!如果您可以更改您的模式,请参阅此处了解更多信息,也可以编写脚本迁移到具有新模式的新数据库:

// 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);
});

最新更新