如果我有许多文件(或数据对象)存储在MongoLab数据库中,类似于:
{"_id":{"$oid":"539467f6e4b02221d856bcd8"},
"Object Type":"Data Object",
"Object Name":"Human",
"Subobject Types":
{"S0":{"User ID":"x"},
"S1":{"Password":"x"},
"S2":{"First Name":"x"},
"S3":{"Middle Name":"x"},
"S4":{"Last Name":"x"},
"S5":{"Cover Name":"x"},
"S6":{"Taxpayer Identification":"x"},
"S7":{"Email Address":"x"},
"S8":{"Smartphone Number":"x"},
"S9":{"Street":"x"},
"S10":{"City":"x"},
"S11":{"State":"x"},
"S12":{"Nation":"x"},
"S13":{"Postal Code":"x"}
}
}
如果我使用REST api对MongoLab数据库进行以下查询调用...
https://api.mongolab.com/api/1/databases/my-db/collections/my-coll?q= {}&安培; apiKey = myAPIKey
其中q = ...
{ "Object Type":"Data Object",
"Object Name":"Human",
"Subobject Types":
{"S0":{"User ID":{}},
"S1":{"Password":{}},
"S2":{"First Name":{}},
"S3":{"Middle Name":{}},
"S4":{"Last Name":{}},
"S5":{"Cover Name":{}},
"S6":{"Taxpayer Identification":{}},
"S7":{"Email Address":{}},
"S8":{"Smartphone Number":{}},
"S9":{"Street":{}},
"S10":{"City":{}},
"S11":{"State":{}},
"S12":{"Nation":{}},
"S13":{"Postal Code":{}}
}
}
...那么为什么db会返回任何内容,即使db中有很多文档(或上面的数据对象)与上面的查询完全匹配?
如果我使用q =
的$ exits查询运算符,它也不会返回任何内容{"Object Type":"Data Object",
"Object Name":"Human",
"Subobject Types":
{"S0":{"User ID":{"$exists":true}},
"S1":{"Password":{"$exists":true}},
"S2":{"First Name":{"$exists":true}},
"S3":{"Middle Name":{"$exists":true}},
"S4":{"Last Name":{"$exists":true}},
"S5":{"Cover Name":{"$exists":true}},
"S6":{"Taxpayer Identification":{"$exists":true}},
"S7":{"Email Address":{"$exists":true}},
"S8":{"Smartphone Number":{"$exists":true}},
"S9":{"Street":{"$exists":true}},
"S10":{"City":{"$exists":true}},
"S11":{"State":{"$exists":true}},
"S12":{"Nation":{"$exists":true}},
"S13":{"Postal Code":{"$exists":true}}
}
}
答案 0 :(得分:1)
很高兴帮助尝试解释您在这两个查询中看到的行为。首先,您要求MongoDB为每个" Subobject Types.SX.Y"找到具有空子文档的文档。字段,但可能没有这样的文档,其中所有这些都是一个空的嵌入文档。
第二个是对$ exists运算符的误用。如果你像这样制定了查询,你可能会得到你正在寻找的结果:
{
"Object Type": "Data Object",
"Object Name": "Human",
"Subobject Types.S0.User ID": {"$exists": true},
"Subobject Types.S1.Password": {"$exists": true},
...
"Subobject Types.S13.Postal Code": {"$exists", true}
}
在这种情况下,您需要在引用嵌入文档中的字段时使用点表示法。如果您在查询中提供文字嵌入式文档,则要求MongoDB查找与所提供的嵌入文档的值完全匹配。
希望这会有所帮助。您可以随时通过电子邮件向support@mongolab.com发送电子邮件,我们也很乐意为您提供帮助。
亲切的问候, 肖恩@ MongoLab