提问者:小点点

在MongoDB中找到未知的钥匙


如何在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:{…}}),但在这里我不知道键值。

那么,我该怎么做呢?


共3个答案

匿名用户

您可以在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);
});