MongoDB и PHP получают только тот продукт, который соответствует штрих-коду - PullRequest
3 голосов
/ 22 марта 2012

У меня есть этот JSON, и вы можете видеть под продуктами, у меня есть штрих-коды для каждого продукта, что я хочу сделать, это только получить информацию, которая соответствует штрих-коду продукта

{
  "company": "village",
  "logo": "http:\/\/www.incard.com.au\/newsite\/template\/images\/movieticket\/4cinemas\/villagetop.png",
  "products": [
    {
      "barcode": "236690091",
      "name": "Weekday",
      "logo-URL": "http: \/\/www.incard.com.au\/newsite\/template\/images\/movieticket\/4cinemas\/ticketpic1.png",
      "price": "12.50",
      "discount": "1.50"
    },
    {
      "barcode": "236690092",
      "name": "Weekend",
      "logo-URL": "http: \/\/www.incard.com.au\/newsite\/template\/images\/movieticket\/4cinemas\/ticketpic1.png",
      "price": "13.50",
      "discount": "1.60"
    },
    {
      "barcode": "236690093",
      "name": "Gold Class",
      "logo-URL": "http: \/\/www.incard.com.au\/newsite\/template\/images\/movieticket\/4cinemas\/ticketpic1.png",
      "price": "13.50",
      "discount": "1.60"
    }
  ],
  "store_name": "movies"
}

, например, если я нажал 236690091 Iтолько то, что база данных (MongoDB) возвращает

"barcode": "236690091",
      "name": "Weekday",
      "logo-URL": "http: \/\/www.incard.com.au\/newsite\/template\/images\/movieticket\/4cinemas\/ticketpic1.png",
      "price": "12.50",
      "discount": "1.50"

не каждому продукту.

Это то, что я пробовал

public function getbarcode($barcode)
    {
        // select a collection (analogous to a relational database's table)
         $collection = $this->db->movies->products;

        // find everything in the collection
        $cursor = $collection->find(array("barcode" =>"{$barcode}"));

        $test = array();
            // iterate through the results
            while( $cursor->hasNext() ) {
                $test[] = ($cursor->getNext());
            }
        //Print Results 
        print json_encode($test);

    }

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Вы не можете сделать это. MongoDB всегда будет возвращать полный документ и не позволит вам вернуть только вложенную часть, по которой вы хотите выполнить поиск. Я бы предложил разделить продукты на отдельные коллекции, а затем добавить информацию о компании для каждого продукта. Это также позволит обойти ограничение в 16 МБ для документов, если у вас много продуктов для каждой компании.

Без изменения схемы должен работать следующий код:

public function getbarcode($barcode)
{
    $products = array();
    $collection = $this->db->movies->products;

    foreach( $collection->find( array( 'products.barcode' => $barcode ) ) as $item )
    {
        foreach( $item->products as $product )
        {
            if ( $product['barcode'] == $barcode )
            {
                $products[] = $item;
            }
        }
    }
    return $products;
}
0 голосов
/ 22 марта 2012

Вы не можете делать это так, как хотите.MongoDB вернет только целые документы или некоторые поля из документов (если вы укажете их в запросе).Вы не можете возвращать только те значения, которые соответствуют вашему запросу.

Вы можете создать отдельную коллекцию, в которой будут храниться только объекты продуктов (со ссылкой на коллекцию, в которой хранятся данные компании), где вы можете напрямую запросить нужные данные продукта.

Если вы не можете / не хотите создавать другую коллекцию, вы можете найти все документы, имеющие продукт с указанным штрих-кодом, и отфильтровать их с помощью PHP.

Для этого второго подхода ваш запрос должен быть:

$collection->find(array("products.barcode" =>"{$barcode}"), 
                  array('products' => 1));

С помощью этого запроса вы достигаете объектов и возвращаете только те документы, которые имеют искомый штрих-код.

Кроме того, в этом запросе вы вернете только свойство products из вашего документа, а не весь документ.Свойство products будет содержать все дочерние объекты, а не только тот, который вы пытаетесь найти.

В вашем цикле while вы должны проверить значения и правильно отфильтровать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...