如何在没有父母对象/字段名称的情况下检索Mongodb子值

时间:2019-08-26 09:50:33

标签: mongodb

是否可以直接查询一种类型的子对象(在不同的父对象/字段下具有相同名称的子对象/字段),而无需在find()命令中调用父名称

例如我有

MondoDB
{
eatable.fruits.tomato
}

{
eatable.vegetables.tomato
}

每个西红柿都是一个在其中分配了一些值的参数,而我在两个不同的对象/字段下都有一个西红柿,

是否可以在不使用find()命令中的字段/对象名称“ fruits”或“ vegetables”的情况下查询和检索番茄的所有值。

1 个答案:

答案 0 :(得分:0)

截至目前,尚无法在不知道父字段的情况下直接搜索子字段,但是我们确实有解决方法。想法是首先通过在find()方法中添加约束条件来过滤文档,然后遍历响应并在“ tomato”键作为叶元素出现的地方打印出值。

以下是示例:

db.collection.find().forEach(
    function processDoc(document){
        let keys = Object.keys(document);
        keys.forEach(
            function(key){  
                let value = document[key];
                if(typeof value === typeof Object()){
                    processDoc(value);  // Its an embedded document, thus process it again
                }else if(key == 'tomato'){ 
                    print(value);
                }
            }
        );
    }
);

数据集:

{
    "_id" : ObjectId("5d63ac599d32d1c15cf5ea5e"),
    "eatable" : {
        "vegetables" : {
            "tomato" : "veg1"
        },
        "fruits" : {
            "tomato" : "fru1",
            "banana": "fru1"
        },
        "misc" : {
            "item" : {
                "tomato" : "misc1"
            }
        }
    }
}
{
    "_id" : ObjectId("5d63ac599d32d1c15cf5ea5f"),
    "eatable" : {
        "fruits" : {
            "tomato" : "fru2"
        }
    }
}

输出:

veg1
fru1
misc1
fru2