使用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]]
还有操场,这样我就可以接受答案了。再次感谢您的输入更新了答案。。