筛选,排序,限制,跳过子文档猫鼬

时间:2019-01-04 22:46:39

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

const A = mongoose.Schema({
...
    bs: [B.schema],
...

 });

所以基本上我有两种模式,一种是另一种的子文档。 从我的数据表中我得到了参数。例如过滤器,页面限制,页面,排序...

我需要做的是,创建一个查询,该查询将使用A模式中的_id获取其所有B模式,并始终对参数进行排序,限制,跳过和过滤。我发送的

我尝试了类似的方法

b = await A.find({'_id' : idA}, 
    { 'bs' : 
        { $slice: [ offset * limit, limit ]
        }
    }); 

它正在工作,但是我仍然不知道如何过滤和排序。 因此,如果有人有任何想法欢迎分享。

P.S对不起,英语不好 问候, 塞勒斯

1 个答案:

答案 0 :(得分:1)

您要执行的操作不是find符合您的数组条件的文档,而是修改结果以适应您的需求。您可以通过两种方法来完成此操作,具体取决于您希望在何处完成处理:

1。 Use MongoDB Aggregation。处理是在数据库中完成的。

聚合管道是确定文档进行查询和转换的一系列步骤。   一个未经测试的粗略示例(可能在语法上错误)是:

A.aggregate([
  { $match: { _id: "id" }},
  { $project: {
      bs: {
        $filter: { input: "$bs" , as: "filteredBs" , cond: { /* conditions object */}  }},
     } 
  },    
  { $slice: ["$filteredBs", offset * limit, limit ] }
  /* ... */
]);

2。通过ID获取文档并处理服务器上的数组。

在这里,您仅受javascript及其数组功能的限制。

const found = A.findById('id');
const bs = A.bs.filter( /* filter function */ ).slice() // ... whatever you want.
A.bs = bs;
return A;