Как получить непосредственных потомков узла в шаблоне Array of Ancestors в MongoDB

У меня есть структура документа mongo DB, которая соответствует шаблону массива предков (http://docs.mongodb.org/master/tutorial/model-tree-structures-with-ancestors-array/)

Как с помощью этого шаблона проектирования получить непосредственных потомков узла?

       A
   |---|---|
   |       |
   B       D
   |       |
   E       F

Итак, учитывая узел A, я бы хотел, чтобы запрос возвращал документы в узлах B и D.


person Community    schedule 03.09.2015    source источник


Ответы (2)


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

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

В Ссылке, которой вы поделились, ниже документы в коллекции:

db.categories.insert( { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
db.categories.insert( { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
db.categories.insert( { _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
db.categories.insert( { _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
db.categories.insert( { _id: "Programming", ancestors: [ "Books" ], parent: "Books" } )
db.categories.insert( { _id: "Books", ancestors: [ ], parent: null } )

Скажем, например, нам нужно найти непосредственных потомков узла «Базы данных».

Для этого сначала нам нужно получить всех предков данного узла «Базы данных».

поэтому мы можем найти его с помощью следующего запроса:

var anst = db.categories.find({_id:"Databases"},{_id:0, ancestors : 1 }).toArray();

он вернет нам следующий вывод:

 [ { "ancestors" : [ "Books", "Programming" ] } ]

так мы познакомились со всеми предками узла "Базы данных".

Документы, которые будут содержать ТОЛЬКО И ВСЕ узла [ "Книги", "Программирование", "Базы данных" ] в полях "предок", являются непосредственными дочерними элементами узла "Базы данных".

Чтобы найти ближайших детей, мы можем использовать следующий запрос:

anst[0].ancestors.push("Databases");

db.categories.find(
                    { "ancestors": 
                               { $all : anst[0].ancestors ,
                                 $size: anst[0].ancestors.length
                               }
                    }
                  );

Это вернет нам следующие документы:

{ _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases"}
{ _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }

Здесь нам важен $size, потому что нам нужны ТОЛЬКО те документы, у которых есть ТОЛЬКО [ "Книги", "Программирование", "Базы данных" ] как там "предки".

Другой пример:

var anst = db.categories.find({_id:"Programming"},{_id:0, ancestors : 1 }).toArray();

Выход :

[ { "ancestors" : [ "Books" ] } ]

мы можем запросить, как показано ниже:

anst[0].ancestors.push("Programming");

db.categories.find(
                   { "ancestors": 
                                { $all : anst[0].ancestors ,
                                  $size: anst[0].ancestors.length
                                }
                   }
                  );

Выход :

{ "_id" : "Databases", "ancestors" : [ "Books", "Programming" ], "parent" : "Programming" }
{ "_id" : "Languages", "ancestors" : [ "Books", "Programming" ], "parent" : "Programming" }
person Yathish Manjunath    schedule 04.09.2015

Поскольку у каждого узла есть родительский идентификатор, вы можете просто сделать это с помощью

`db.yourCollection.find( { parent: "A" } )`
person YasarArafat    schedule 05.04.2018