Найти, когда ключи неизвестны в mongodb - PullRequest
0 голосов
/ 13 декабря 2018

Как я могу получить данные с электронной почтой abc@gmail.com в mongoDB? Я не знаю Key Name и хочу перебрать все данные.

У меня есть такие данные:

{
    "_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 ]

0 голосов
/ 13 декабря 2018

Я думаю, что вы не можете сделать запрос полностью неизвестно поле!если вы можете изменить свою схему, см. здесь для получения дополнительной информации, также вы можете написать скрипт для миграции на новую БД с новой схемой:

// 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"
    }
}

в противном случае, проверьте this может работать правильно.если все они не эффективны, сделайте запрос, чтобы получить все ваши данные как 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);
});
0 голосов
/ 13 декабря 2018

Вы можете использовать агрегацию ниже, используя $objectToArray в mongodb 3.4 и выше

db.collection.aggregate([
  { "$addFields": {
    "field": { "$objectToArray": "$$ROOT" }
  }},
  { "$match": { "field.v.email": "abc@gmail.com" }},
  { "$project": { "field": 0 }}
])
0 голосов
/ 13 декабря 2018

Я предполагаю, что вы получаете объекты в виде массива.

Я создал метод с именем 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' } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...