Mongodb 流星。按深度嵌套的值对集合进行排序

Mongodb 流星。按深度嵌套的值对集合进行排序,mongodb,meteor,aggregation-framework,Mongodb,Meteor,Aggregation Framework,在我的应用程序中,我有一个代表投资组合中每个项目的瓷砖列表。这是应用程序的主列表视图,所有项目都是从集合中获取的,没有任何排序或排序 当我在路线中指定了可选的slug参数(对于分配给项目的类别)时,我希望能够在UI中首先显示与该类别匹配的项目,然后显示与该类别不匹配的其他项目 为了便于参考,我在下面列出了路线代码: /** *项目列表视图(所有项目),带有可选选项 *仅按显示项目的筛选参数 *他们的类别名称。 */ this.route('list'{ 路径:'/:_类别_段塞?', 模板:'

在我的应用程序中,我有一个代表投资组合中每个项目的瓷砖列表。这是应用程序的主列表视图,所有项目都是从集合中获取的,没有任何排序或排序

当我在路线中指定了可选的slug参数(对于分配给项目的类别)时,我希望能够在UI中首先显示与该类别匹配的项目,然后显示与该类别不匹配的其他项目

为了便于参考,我在下面列出了路线代码:

/**
*项目列表视图(所有项目),带有可选选项
*仅按显示项目的筛选参数
*他们的类别名称。
*/ 
this.route('list'{
路径:'/:_类别_段塞?',
模板:'template_main',
行动:功能(){
if(this.ready()){
这个。render();
}
},
waitOn:function(){
返回[
Meteor.subscribe(“项目”),
流星。订阅(“编队”),
Meteor.subscribe('类别')
];
},
数据:函数(){
if(此参数为类别为段塞){
/**
*根据类别slug和语言构建查询
*/
var query={};
查询['slug.+App.language]=this.params.\u category\u slug;
/**
*抓取给定查询的类别,以便获取其“id”
*/
var category=App.models.categories.findOne(查询);
/**
*这是我需要处理的问题,这样我才能实现我想要的
*/
返回App.models.projects.find({}).fetch();
}
否则{
返回App.models.projects.find({}).fetch();
}
},
产量模板:{
'components_header':{to:'header'},
'views_list':{to:'content'},
'components_footer':{to:'footer'}
}
});
为了便于参考,我还提供了与此问题相关的三个项目的数据样本

{
“id”:10,
“鼻涕虫”:{
“en”:“英语鼻涕虫样本”,
},
“标题”:{
“en”:“示例英文标题”,
},
“说明”:{
“恩”:“一个很好的描述。”,
},
“类别ID”:[
{
“id”:5
},
{
“id”:6
}
],
},
{
“id”:12,
“鼻涕虫”:{
“en”:“另一个样本段塞”,
},
“标题”:{
“en”:“另一个示例标题”,
},
“说明”:{
“en”:“样本说明三”,
},
“类别ID”:[
{
“id”:1
},
{
“id”:4
}
],
},
{
“id”:11,
“鼻涕虫”:{
“en”:“另一个样本段塞”,
},
“标题”:{
“en”:“示例标题”,
},
“说明”:{
“en”:“样本说明”,
},
“类别ID”:[
{
“id”:2
},
{
“id”:5
}
],
}
所以我想做的是确保给定一个ID为5的类别,我希望前两个项目是出现的前两个

这可以在meteor中完成,而不必在JS中编写额外的逻辑吗?我曾经使用过的一种方法是从客户端集合中更新每个项目(我不再这样做),并设置一些额外的属性,然后进行排序

在处理同步客户端和服务器集合时,这实际上是不可行的。

来自mongodb:

使用点表示法按嵌入文档中的特定字段进行匹配。嵌入文档中特定字段的相等匹配将选择集合中的文档,其中嵌入文档包含具有指定值的指定字段。嵌入的文档可以包含其他字段

我不知道是否可以用一个查询来完成,但是可以用两个使用点表示法的互补查询来完成

var selected=App.models.projects.find({'category_id.id':category._id}).fetch();
var other=App.models.projects.find({'category_id.id':{$ne:category._id}).fetch();
返回所选。concat(其他);

谢谢您的回答,但我不是在尝试筛选文档,而是只显示收藏中的某些文档。我想显示所有文档,但首先应该显示的是类别ID为5的文档。这是一个解决方案,目前可以使用,而且足够干净。谢谢