文档结构示例是:
{
"dob": "12-13-2001",
"name": "Kam",
"visits": {
"0": {
"service_date": "12-5-2011",
"payment": "40",
"chk_number": "1234455",
},
"1": {
"service_date": "12-15-2011",
"payment": "45",
"chk_number": "3461234",
},
"2": {
"service_date": "12-25-2011",
"payment": "25",
"chk_number": "9821234",
}
}
}
{
"dob": "10-01-1998",
"name": "Sam",
"visits": {
"0": {
"service_date": "12-5-2011",
"payment": "30",
"chk_number": "86786464",
},
"1": {
"service_date": "12-15-2011",
"payment": "35",
"chk_number": "45643461234",
},
"2": {
"service_date": "12-25-2011",
"payment": "20",
"chk_number": "4569821234",
}
}
}
在PHP中,我想列出付款小于“30”的所有“访问”信息(和相应的“名称”)。
我想只打印“付款”< “30”不是其他人。这样的查询是否可行,或者我是否必须先使用搜索获取整个文档,然后使用PHP来选择此类访问?
答案 0 :(得分:18)
在示例文档中,“payment”值以字符串形式给出,这些字符串可能与$ lt命令无法正常工作。对于此响应,我已将它们转换为整数。
MongoDB无法进行通配符查询,因此对于给定的文档结构,必须知道子文档的键(0,1,2等)。例如,以下查询将起作用:
> db.test.find({"visits.2.payment":{$lt:35}})
然而,
> db.test.find({"visits.payment":{$lt:35}})
在这种情况下不起作用,
> db.test.find({"visits.*.payment":{$lt:35}})
也不会返回任何结果。
为了能够查询嵌入的“访问”文档,您必须更改文档结构并对数组或嵌入文档进行“访问”,如下所示:
> db.test2.find().pretty()
{
"_id" : ObjectId("4f16199d3563af4cb141c547"),
"dob" : "10-01-1998",
"name" : "Sam",
"visits" : [
{
"service_date" : "12-5-2011",
"payment" : 30,
"chk_number" : "86786464"
},
{
"service_date" : "12-15-2011",
"payment" : 35,
"chk_number" : "45643461234"
},
{
"service_date" : "12-25-2011",
"payment" : 20,
"chk_number" : "4569821234"
}
]
}
现在,您可以在“访问次数”中查询所有嵌入的文档:
> db.test2.find({"visits.payment":{$lt:35}})
有关详细信息,请参阅有关点符号的Mongo文档:
http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
现在问题的第二部分:不可能只返回嵌入文档的条件子集。
使用任一文档格式,都无法返回仅包含与查询匹配的子文档的文档。如果其中一个子文档与查询匹配,则整个文档与查询匹配,并将返回该查询。
根据Mongo文档“检索字段的子集”
http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields
我们可以返回部分嵌入文档:
> db.test2.find({"visits.payment":{$lt:35}},{"visits.service_date":1}).pretty()
{
"_id" : ObjectId("4f16199d3563af4cb141c547"),
"visits" : [
{
"service_date" : "12-5-2011"
},
{
"service_date" : "12-15-2011"
},
{
"service_date" : "12-25-2011"
}
]
}
但我们不能对某些子文档进行条件检索。我们可以得到的最接近的是$ slice运算符,但这不是有条件的,您必须首先知道数组中每个子文档的位置:
为了使应用程序仅显示与查询匹配的嵌入文档,必须以编程方式完成。
答案 1 :(得分:1)
您可以尝试:
$results = $mongodb->find(array("visits.payment" => array('$lt' => 30)));
但是我不知道它是否会起作用,因为visits
是一个对象。从你发布的内容判断BTW可以转移到数组(或者因为数字属性名称会导致混淆)
答案 2 :(得分:0)
尝试 - db.test2.find({“visits.payment”:“35”})