是否可以直接查询一种类型的子对象(在不同的父对象/字段下具有相同名称的子对象/字段),而无需在find()命令中调用父名称
例如我有
MondoDB
{
eatable.fruits.tomato
}
{
eatable.vegetables.tomato
}
每个西红柿都是一个在其中分配了一些值的参数,而我在两个不同的对象/字段下都有一个西红柿,
是否可以在不使用find()命令中的字段/对象名称“ fruits”或“ vegetables”的情况下查询和检索番茄的所有值。
答案 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