2013-11-09 4 views
3

Моя коллекция одежды mongo. Существует два типа продуктов: дочерний и родительский. Родительский продукт содержит массив своего дочернего элемента в качестве ссылки.MongoDB - как присоединиться к родительским и дочерним продуктам по ссылке

использования:

use mydb; 

child1 = { 
    _id: 1, 
    name: "Child 1", 
    is_child: true, 
    is_parent: false, 
    children : [] 
} 

child2 = { 
    _id: 2, 
    name: "Child 2", 
    is_child: true, 
    is_parent: false, 
    children : [] 
} 

parent = { 
    _id: 3, 
    name: "Parent product", 
    is_child: false, 
    is_parent: true, 
    children : [1, 2] 
} 

db.product.insert([child1, child2, parent]); 

И я ищу для любого запроса возвращающегося

{ 
    _id: 3, 
    name: "Parent product", 
    is_child: false, 
    is_parent: true, 
    children: [ 
     { 
      _id: 1, 
      name: "Child 1", 
      is_child: true, 
      is_parent: false, 
      children : [] 
     }, 
     { 
      _id: 2, 
      name: "Child 2", 
      is_child: true, 
      is_parent: false, 
      children : [] 
     } 
    ] 
} 

Я новичок в MongoDB, но я угадать использование карты-свертка может решить проблему , Может кто-нибудь советовать? Thx

+1

Вы можете сделать это на программном уровне, используя два округления. Такие драйверы, как Mongoose (http://mongoosejs.com/), предлагают это из коробки. Так называемое «заселение». – Prinzhorn

+0

Есть ли способ, как это сделать по запросу? – Jaro

+0

Если вы спросите об одной команде 'find' или' findOne', ответ будет отрицательным. – zero323

ответ

4

Из оболочки вы можете использовать код, как показано ниже, хотя это не очень эффективный подход. В зависимости от размера документов для детей и уровня вложенности вы должны учитывать вложение вместо привязки.

query = {_id: 3} 
db.product.find(query).map(function(doc) { 
    doc.children = db.product.find({_id: {$in: doc.children}}).toArray(); 
    return doc; 
}) 
+0

Может быть, это может решить мою проблему, по крайней мере, она возвращает в оболочке то, что я хочу, но cursor.map() поддерживается любым PHP клиентская библиотека? Я не могу найти его – Jaro

+0

Есть ли какой-либо другой язык, поддерживающий cursor.map()? – Jaro

+0

В 'map' нет ничего особенного. Он просто принимает итерируемый объект, применяет некоторую функцию к каждому элементу и возвращает массив модифицированных элементов. Вы можете имитировать это поведение на любом клиенте, используя, например, циклы. – zero323

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