我有一个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.我正在讨论只做一个选择,但我希望有一个更简单的答案。
答案 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 })