使用REST的MongoLab db查询

时间:2014-06-08 16:10:57

标签: mongodb rest mlab

如果我有许多文件(或数据对象)存储在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}}
  }
}

1 个答案:

答案 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