MongoDB Java使用正则表达式查找嵌套对象

时间:2014-01-29 02:56:00

标签: java regex mongodb

我正在使用MongoDB驱动程序在下面创建查询。我只是想知道两个代码的功能有什么区别:

返回0;的地址:{ “houseBldgNum”}

db.students.count({ "studentName" : { "$regex" : "(.+)?JAN(.+)?" , "$options" : "i"} , "address" : {"houseBldgNum" : { "$regex" : "(.+)3(.+)?" , "$options" : "i"} }})

返回2;的 address.houseBldgNum

db.students.count({ "studentName" : { "$regex" : "(.+)?JAN(.+)?" , "$options" : "i"} , "address.houseBldgNum" : { "$regex" : "(.+)3(.+)?" , "$options" : "i"} })

数据:

{
  "studentName":"JAN M",
  "address":{
    "houseBldgNum":"3"
  },
  "studentName":"JAN K",
  "address":{
    "houseBldgNum":"35"
  }
}

我希望这两个代码应该返回相同的结果,但不是。

提前致谢!

2 个答案:

答案 0 :(得分:0)

根据您上面提供的示例数据,"houseBldgNum":"3"是文档中的文档。

{
  "studentName":"JAN M",
  "address":{
    "houseBldgNum":"3"
  }

要访问单个文档值,只需提供键值对即可。就像address:{"houseBldgNum"}

一样

但要访问文档中的文档,您需要使用。(点)表示法来访问内部字段。

所以正确的语法是使用address.houseBldgNum

答案 1 :(得分:0)

第二个查询的作用是“地址”是嵌入在顶级文档中的嵌套json文档。如果要访问嵌套文档,则需要使用“address.houseBldgNum”符号。

摘自MongoDB文档:

点符号 MongoDB使用点表示法来访问数组的元素并访问子文档的字段。

要通过从零开始的索引位置访问数组的元素,请将数组名称与点(。)和从零开始的索引位置连接起来,并用引号括起来: 'array.index' 要使用点表示法访问子文档的字段,请将子文档名称与点(。)和字段名称连接起来,并用引号括起来: 'subdocument.field'