MongoDB& PHP只获得与条形码匹配的产品

时间:2012-03-22 06:30:07

标签: php mongodb search find database

我有这个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我只返回数据库(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 个答案:

答案 0 :(得分:1)

你不能这样做。 MongoDB将始终返回完整文档,并且不允许您仅返回要搜索的嵌套部分。我建议将产品拆分成自己的产品系列,然后将公司信息添加到每个产品中。如果您为每家公司提供大量产品,这也将规避16MB的文件限制。

在不更改架构的情况下,以下代码应该有效:

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;
}

答案 1 :(得分:0)

你不能按照你想要的方式做到这一点。 MongoDB将仅返回文档中的整个文档或某些字段(如果在查询中指定它们)。您不能仅返回查询匹配的值。

您可以创建一个单独的集合,该集合仅保存产品对象(引用包含公司数据的集合),您可以在其中直接查询所需的产品数据。

如果您不能/不会创建另一个集合,您可以找到所有包含指定条形码的产品的文档,并使用PHP过滤掉它们。

对于第二种方法,您的查询应该是:

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

使用此查询,您reaching into objects并仅返回包含您要查找的条形码的文档。

此外,在此查询中,您只会返回文档中的products属性,而不是整个文档。 products属性将包含所有子对象,而不仅仅是您要查找的对象。

while循环中,您应检查值并正确过滤掉它们。