sql >> データベース >  >> NoSQL >> MongoDB

DoctrineODMとスキーマレス設計

    解決策は、@ Hash

    を使用することです。

    これが私が行った非常に基本的な例です:

    <?php
    
    /**
     * @Document
     */
    class Product
    {
    
        /**
         * @Id
         */
        private $id;
    
        /**
         * @String
         */
        private $name;
    
        /**
         * @Hash
         */
        private $attributes = array();
    
        public function getId()
        {
            return $this->id;
        }
    
        public function setName($name)
        {
            $this->name = $name;
        }
    
        public function getName()
        {
            return $this->name;
        }
    
        public function addAttribute($name, $value)
        {
            $key = preg_replace('/[^a-z0-9\ \_]/i', '', $name);
            $key = preg_replace('/\s+/i', '_', $key);
            $key = strtolower($key);
            $this->attributes[$key] = array('value' =>$value, 'label' => $name);
        }
    
        public function getAttribute($name)
        {
            return $this->attributes[$name];
        }
    
        public function getAttributes()
        {
            return $this->attributes;
        }
    
    }
    

    データを追加する:

    <?php
    
    $pen = new Product();
    $pen->setName('Cool Pen');
    $pen->addAttribute('Weight', 12);
    $pen->addAttribute('Ink Colour', 'Red');
    $pen->addAttribute('Colour', 'Black');
    
    $tv = new Product();
    $tv->setName('LED LCD TV');
    $tv->addAttribute('Weight', 12550);
    $tv->addAttribute('Screen Size', 32);
    $tv->addAttribute('Colour', 'Black');
    
    $dm->persist($pen);
    $dm->persist($tv);
    
    $dm->flush();
    

    次に、クエリを実行し、色が「黒」で画面サイズが20より大きい製品を見つけます。

    <?php
    
    $query = $dm->createQueryBuilder('Catalogue\Product');
    $products = $query->field('attributes.colour.value')->equals('Black')
                    ->field('attributes.screen_size.value')->gte(20)
                    ->getQuery()->execute();
    

    これがこれを行うための最良の方法であるかどうかはまだわかりませんが、私の研究はまだ進行中です。



    1. マングース:ObjectIdへのキャストに失敗しました

    2. typescriptを使用してマングースモデルでカスタムクエリヘルパーを定義するにはどうすればよいですか?

    3. MongoDBスキーマ計画のヒント

    4. GridFSを使用してNode.jsとMongooseを使用して画像を保存する方法