2015-03-10 5 views
0

У меня есть коллекция Mongo, которая содержит наборы данных с pmID иIDID, гдеIDID может быть null или pmID. Я пытаюсь выяснить, если я выберу PMID, как я могу получить PM, где pmID = replyID, и если идентификатор ответа этого номера не равен нулю, объект, который соответствует этому, и т. Д.Рекурсивный поиск в MongoDB

{ 
    pmID: 1, 
    replyID: null 
}, 
{ 
    pmID: 2, 
    replyID: null 
}, 
{ 
    pmID: 3, 
    replyID: 1 
}, 
{ 
    pmID: 4, 
    replyID: 3 
} 

Так что, если я выбрал на pmID = 4, я также хочу получить 3 и 1. Я обсуждаю, как просто делать один за другим, но я надеюсь, что есть более простой ответ.

ответ

2

Не совсем уверен в вашем случае использования здесь, но с первого взгляда я бы лично модель для хранения «предков», чтобы с объектом, как так:

{ 
    "pmId": 1, 
    "replyIds": [ ] 
}, 
{ 
    "pmId": 3, 
    "replyIds": [ 1 ] 
},  
{ 
    "pmId": 4, 
    "replyIds": [ 3, 1 ] 
} 

В любом таком порядке или в в зависимости от того, как вы реализуете историю предков.

Суть в том, что при выдаче «ответа» на существующий объект вы уже должны иметь загруженные данные, которые сообщают вам, есть ли какие-либо существующие ответы. Новый объект затем выталкивает идентификатор объекта он выпускается в ответ на существующий массив «replyIds», когда создается, что новый объект:

// data is "pmId": 3 object 

data.replyIds.unshift(data.pmId); 
data.pmId = getNewPmId(); // whatever 

db.collection.insert(data); 

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

Получение всех предков это всего лишь простой вопрос прохождения массива ответов на $in:

var data = db.collection.findOne({ "pmId": 4 }); 

db.collection.find({ "pmId": { "$in": data.replyIds } }) 
+0

Это отличная точка, спасибо! Я посмотрю, это может быть мое решение. Сказав, что такое getNewPmId() в вашем решении? Функция, которую я угадываю? Я читал, что выбор объектов в функции не проходит через индекс; это сбивало с толку, и я волнуюсь, что неправильно понял, что он говорил. Я еще ничего не делал с функциями. – RhoVisions

+0

@RhoVisions Не совсем уверен, что такое «pmId» для вас, и я просто воспринимаю это как «пример», поэтому просто «некоторый метод», чтобы получить уникальный идентификатор. Конечно, если вы просто используете «ObjectId» и «pmId», это действительно основной ключ «_id», тогда нет необходимости в создании пользовательской логики для получения «нового уникального идентификатора». –

+0

Я парень MySQL, делающий переход к изучению/использованию Mongo, поэтому я все еще использую некоторые соглашения SQL. pmID является последовательным идентификатором в дополнение к mongo сгенерированным _id. Я бы использовал только созданный mongo, но, пытаясь сделать дружественный URL, короткий, уникальный идентификатор намного проще. – RhoVisions

0

В дополнении к предложению Нейла использовать предок массивы, если вы моделирование разговоров вы можете группировать беседы с а conversation_id и вспомнить все сообщения, связанные с данным одного по conversation_id:

{ 
    "pmId": 1, 
    "conversationId" : 0 
}, 
{ 
    "pmId": 3, 
    "conversationId" : 0 
},  
{ 
    "pmId": 4, 
    "conversationId" : 0 
} 

> var pm = db.test.findOne({ "pmId" : 3 }) 
> db.test.find({ "conversationId" : pm.conversationId }) 
+0

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

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