代码之家  ›  专栏  ›  技术社区  ›  Harsh Patel Sam

在mongodb中查找密钥未知的时间

  •  2
  • Harsh Patel Sam  · 技术社区  · 7 年前

    如何获取包含电子邮件的数据 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:{...}})

    那么,我该怎么做呢?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Ashh    7 年前

    您可以使用以下聚合 $objectToArray 在mongodb 3.4 及以上

    db.collection.aggregate([
      { "$addFields": {
        "field": { "$objectToArray": "$$ROOT" }
      }},
      { "$match": { "field.v.email": "abc@gmail.com" }},
      { "$project": { "field": 0 }}
    ])
    
        2
  •  0
  •   Shams Nahid    7 年前

    我假设你得到的是数组类型的对象。

    我创建了一个名为 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' } }
    
        3
  •  0
  •   eerFun    7 年前

    我想你 不能 未知的 领域如果可以更改模式,请参见 here 有关更多信息,您还可以编写脚本以使用新架构迁移到新数据库:

    // 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);
    });
    
    推荐文章