Intereting Posts

как считать встроенный mongodb php?

У меня проблема с php и MongoDB. Вот мой документ:

"_id" : ObjectId("58d7815f387e76880c000000"), "receiver" : "Katty", "chat" : [ { "sender" : "jhon", "date" : ISODate("2017-03-26T08:53:55Z"), "message" : "Who are you?" "status" : "sent" }, { "sender" : "jhon", "date" : ISODate("2017-03-26T08:53:55Z"), "message" : "What do you want?" "status" : "pending" } { "sender" : "jhon", "date" : ISODate("2017-03-26T08:53:55Z"), "message" : "Hah ?" "status" : "pending" } ] 

И вот моя программа php:

 <?php $conn = new Mongo(); $db = $conn->selectDB('basarnas'); $query = $db->informasi_bencana; $nosql = array("_id"=> new MongoId($id), "chat.status"=>"pending"); $result = $query->find($nosql); $beritasar = $result->count(); $total = $beritasar; echo "status pending = ".$total; ?> 

И результат

 status pending = 1 

И я хочу, чтобы результат

 status pending = 2 

Как подсчитать встроенный документ, когда он имеет статус = «ожидающий»?

Вы можете развернуть встроенный документ, а затем сопоставить статус, а затем с помощью groupby подсчитать все документы.

 db.collection.aggregate([ { "$unwind": "$chat"}, {$match:{"chat.status": "pending"}}, { "$group":{"_id":null, count: {$sum:1}}} ]) 

ИЛИ

Упростить выборку всех документов и подсчитать длину массива

 db.collection.aggregate([ { "$unwind": "$chat"}, {$match:{"chat.status": "pending"}}, ]) 

Вы можете попробовать выполнить запрос с помощью последнего драйвера php. Вы можете $filter встроенные документы chat для pending статуса, за которым следует $size .

 <?php $mongo = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $pipeline = [ [ '$match' => [ '_id' => new MongoDB\BSON\ObjectID($id), ], ], [ '$project' => [ 'count' => [ '$size' => [ [ '$filter' => [ 'input' => '$chat', 'as' => 'chatf', 'cond' => [ '$eq' => [ '$$chatf.status', 'pending', ] ], ], ], ], ], '_id' => 0 ], ], ]; $command = new \MongoDB\Driver\Command([ 'aggregate' => 'collection_name', 'pipeline' => $pipeline ]); $cursor = $mongo->executeCommand('db_name', $command); foreach($cursor as $key => $document) { var_dump($document); } ?>