这个问题让我疯狂。我需要Meteor.publish中的代码来获取非空对象数组。
下面显示了一个示例结构(此处的字段名称是任意的,我只是呈现结构) -
Books:{
_id:'xyz',
name:'book1',
image:[binary array],
pages:[
{
id:1,
name:'page1',
author:'ueye',
picture:[binary array]
chapters:{
mon:[
{
chapter1:'zzz',
chapter2:'xxx'
}
],
tue:[
{
chapter1:'123',
chapter2:'yyy'
}
],
wed:[],
thu:[],
fri:[],
wkd:[],
}
},
{
id:2,
name:'page2',
author:'asfnwro',
picture:[binary array],
chapters:{
mon:[
{
chapter1:'xyz',
chapter2:'uuu'
}
],
tue:[],
wed:[
{
chapter1:'7777',
chapter2:'ieismxi',
}
],
thu:[],
fri:[],
wkd:[],
}
}
]
}
在这个例子中,你看到我有一个' tue'用空数组(看看结尾)。我想要获取所有章节.tue'这不是空的。 请注意,我不希望仅整个文档(在此示例中)' pages.id',' pages.name',' pages.picture'以及来自" chapters.tue'的所有字段。那些非空的数组(' chapter.tue') 保证章节将始终具有一周中每天的数组,但这些数组本身可能有也可能没有元素。当填充这些数组时,结构总是相同的(在上面的例子中,你将始终拥有chapter1,你将在数组中始终拥有chapter2)。
感谢您的帮助。
答案 0 :(得分:0)
到目前为止,我得到了这个 -
db.myDoc.aggregate([
{$match:{'_id':'xyz'}},
{$unwind:'$pages'},
{$match:{'pages.chapters.tue':{$not:{$size:0}}}},
{$project:{'name':1, 'pages.chapters.tue':1}},
{$group:{'_id': '$_id','name': {$first:'$name'},
'chapters': { $addToSet:'$pages.chapters.tue'}}
}
])
答案 1 :(得分:0)
这是我最终做的解决方案 - 我发现了一个可以用来从MongoDB聚合中获得反应的'反应聚合'包。 但是,聚合不适合我,因为它变得非常复杂。对于我认为应该简单的事情的双重投影和双重分组。我不想将我的集合分解成较小的集合,因为这个结构对我来说很有意义(书有页面,每个页面都有章节,在这种情况下,章节分布在一周中的几天)。要开始将此集合分解为多个集合,以便我可以“分组”将我带回SQL服务器。
我最终在集合上使用'find'来投影我需要的字段。麻烦是“查找”在文档级别上工作,因此您仍然可以获得空数组。我使用了一个名为'publish-composite'的Meteor包来将此订阅发布到仅客户端集合中(因此我最终没有与我在我的应用程序中为相同'书籍'集合的其他订阅结合)。我在客户端上进行过滤(也就是说,我在客户端检测到哪些数组是空的,只显示填充的数组)。
如果这里有人知道一个简单的聚合管道来实现这个功能,我仍然非常乐意学习。