使用php从mongodb中的数组获取文档
我有以下文件使用php从mongodb中的数组获取文档,php,mongodb,Php,Mongodb,我有以下文件 { "_id" : ObjectId("608d5b653979af6a8555f643"), "eMail" : "ben@moskitofactory.com", ... "billing" : [ { "company" : "MoskitoFactory",
{
"_id" : ObjectId("608d5b653979af6a8555f643"),
"eMail" : "ben@moskitofactory.com",
...
"billing" : [
{
"company" : "MoskitoFactory",
"salutation" : "1",
"firstname" : "Ben",
"lastname" : "Water",
"address_line_1" : "Black 1235",
"address_line_2" : "",
"address_line_3" : "",
"zip" : "555",
"city" : "Onecity"
},
{
"company" : "Witchcraft4U",
"salutation" : "1",
"firstname" : "Mike",
"lastname" : "Phone",
"address_line_1" : "Sea 4445",
"address_line_2" : "",
"address_line_3" : "",
"zip" : "12345",
"city" : "Somecity"
}
]
}
如何获取阵列索引为0的帐单地址
我是这样想的
$billing = $db->buyer->findOne([
'_id' => new MongoDB\BSON\ObjectID($_SESSION['uid'])
],[
'projection' => ['billing.0' => 1]
]
);
var_dump($billing->billing);
但它只给了我
object(MongoDB\Model\BSONArray)#28 (1) {
["storage":"ArrayObject":private]=>
array(2) {
[0]=>
object(MongoDB\Model\BSONDocument)#26 (1) {
["storage":"ArrayObject":private]=>
array(0) {
}
}
[1]=>
object(MongoDB\Model\BSONDocument)#27 (1) {
["storage":"ArrayObject":private]=>
array(0) {
}
}
}
}
我不知道查询是否正确,也不知道如何显示结果。但如果我读对了,它会返回两个对象,而不是一个(账单地址0)尝试操作符从对象数组中获取特定元素,这将返回数组中的单个元素对象
$billing=$db->buyer->findOne([
'\u id'=>new MongoDB\BSON\ObjectID($\u会话['uid'])
],[
'投影'=>['计费'=>['$slice'=>[0,1]]
])
如果只想获取对象而不是数组,请尝试使用
$arrayElemAt
运算符从特定索引获取对象
这是从MongoDB 4.4开始的,您可以在find/findOne方法的投影中使用聚合操作符
$billing=$db->buyer->findOne([
'\u id'=>new MongoDB\BSON\ObjectID($\u会话['uid'])
],[
'投影'=>['billing'=>['$arrayElemAt'=>['$billing',0]]
])
谢谢,但这并不完全是我想要的,但我在文档中看到,您可以给$slice一个数组<代码>“计费”:{$切片:[ 1, 1 ] } /代码>,但在PHP中,我不能这样做:-(<代码>‘投影’=> [帐单'=> [ $'切片=> [1,1] ] <代码>给了我一个错误(PHP 7.4),但我也考虑升级MangGDB,因为我喜欢在操场上第二次查询的结果更好;-我认为您使用的是错误的$PLAG语法,只需按照我的回答进行尝试'projection'=>['billing'=>['$slice'=>1]],这应该会起作用。您可能会看到docu aggregation$slice操作符$slice有一个单独的语法,它只支持聚合中的$slice。它现在可以使用这种语法-这是一个有线缓存问题,让我觉得它不支持
$slize=>1
从一开始就给我1个数组,2给我2个数组,但是$slice=>[0,1]
意味着跳过、限制并给我想要的数组,在我们的例子中(第一个数组两个结果都是相同的)你能更新你的答案吗第一个语法'projection'=>['billing'=>['$slice'=>[0,1]]
还有操场,这样我就可以接受答案了。再次感谢您的输入更新了答案。。