MongoDB中的递归搜索

时间:2015-03-10 03:55:11

标签: mongodb mongodb-query

我有一个Mongo集合,其中包含带有pmID和replyID的数据集,其中replyID可以为null或pmID。我试图找出,如果我通过pmID选择,我如何也可以获得pmID = replyID的PM,如果该set的replyID不是null,那么匹配的对象等等。

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

因此,如果我在pmID = 4时选择,我也想得到3和1.我正在讨论只做一个选择,但我希望有一个更简单的答案。

2 个答案:

答案 0 :(得分:2)

这里不太确定你的用例,但是我会亲眼目睹一下这个用来存储"祖先"按照这样的对象顺序:

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

无论是顺序还是反向,取决于您实现祖先历史的方式。

关键在于发出"回复"对于现有对象,您应该已经加载了数据,告诉您是否存在任何现有回复。然后,新对象将其发出的对象的id作为回复推送到现有的" 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 } }) 

答案 1 :(得分:0)

除了Neil建议使用祖先数组之外,如果您正在建模对话,您可以将对话与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 })