2014-02-19 3 views
0

Я разрабатываю приложение с MongoDB и nodejs Я должен также упомянуть, что я новичок и поэтому, пожалуйста, помогите мне через этот вопросСсылка _id в поддокументе в другой коллекции MongoDB

моей база данных имеют категории сбора а затем в каждой категории я хранение продуктов в поддокументе так же, как показано ниже:

{ 
    _id : ObjectId(), 
    name: String, 
    type: String,   
    products : [{ 
     _id : ObjectId(), 
     name : String, 
     description : String, 
     price : String 
    }] 
}); 

Когда дело доходит до хранения заказов в базе данных коллекция заказов будет выглядеть следующим образом:

{ 
    receiver : String, 
    status : String, 
    subOrders : [ 
     { 
      products :[{ 
       productId : String, 
       name : String, 
       price : String, 
       status : String 
      }], 

      tax : String,    
      total : String, 
      status : String, 
      orderNote : String 
     } 
    ] 
} 

Как вы можете видеть, мы сохраняем _id продуктов, которые являются поддокументом категорий в заказах при хранении нет проблем, очевидно, когда дело доходит до получения этих данных, если нам просто нужно ограниченное поле, например имя или цена также не будет проблемой, но если позже нам понадобятся дополнительные поля из таких продуктов, как описание, ... они не хранятся в заказах.

Мой вопрос: Есть ли простой способ доступа к другим областям продуктов, кроме цикла по всем категориям в mongodb, а именно, мне нужен образец кода для запроса описания продукта, только имея его _id в MongoDB?

или наш дизайн и реализация были неправильными, и я должен перепроектировать его с нуля и отделить продукты от категорий в другой коллекции?

пожалуйста, не ставьте ссылки на веб-сайты или блоги, которые обычно говорит о MongoDB и его реализации коллекций, если они не сосредоточены на очень похожий вопрос помоему

заранее спасибо

ответ

1

Я бы предположить, что вы 'd хотите вернуть столько описаний продуктов, сколько соответствовало текущему списку продуктов, так что во-первых, нет запроса на возврат только соответствующих элементов массива. Используя $elemMatch, вы можете вернуть определенный элемент или первое совпадение, но не только соответствующие элементы массива. Однако $elemMatch также может использоваться в качестве оператора проекции.

db.categories({ "products._id" : "PID1" }, 
       { $elemMatch : { "products._id" : "PID1" }, 
       "products._id" : 1, 
       "products.description" : 1}) 

Вы бы определенно хотите индексировать "products._id" поля для достижения разумной производительности.

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

Предполагая, что это правда:

Вам необходимо загрузить данные из второй коллекции вручную. В MognoDb нет подключений. Вы можете использовать $in, который берет список значений для поля и загружает все соответствующие документы.

В зависимости от того, какой драйвер вы используете для доступа к MongoDb, вы можете использовать функцию проецирования find, которая может ограничить поля, возвращаемые для документа, только указанными вами.

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

db.products.find({ _id: { $in : [ 'PID1', 'PID2'] } }, { description : 1 }) 
+0

Я думаю, что было достаточно ясно, на мой вопрос, и при условии достаточно деталей на самом деле нет коллекции продуктов в моем дб, .. Существует а н и имеет поддокумент, который хранит продукты и так как я новый to Mongodb Я ищу самый быстрый запрос и наиболее оптимизированный, который извлекает продукт. Описания только с продуктом _id – Siavosh

+0

Извините, я мысленно перевел его в рабочую структуру. Я добавил несколько подробностей, объясняющих, почему ваша предлагаемая структура не будет работать для ваших требований. – WiredPrairie

+0

Спасибо за обновление ответа, поэтому ваше предложение состоит в том, чтобы избежать более одного шага, вложенного в элементы – Siavosh

Смежные вопросы