Node.js 筛选、排序、限制、跳过子文档mongoose

Node.js 筛选、排序、限制、跳过子文档mongoose,node.js,mongodb,mongoose,mongoose-schema,mongoose-populate,Node.js,Mongodb,Mongoose,Mongoose Schema,Mongoose Populate,基本上我有两个模式,一个是另一个的子文档。 从我的数据表中,我得到了参数。如筛选器、页面限制、页面、排序 我需要做的是,创建一个查询,该查询将使用一个模式的_id获取他的所有B模式,并始终使用参数进行排序、限制、跳过和筛选。我送的 我试过这样的东西 const A = mongoose.Schema({ ... bs: [B.schema], ... }); 它正在工作,但我仍然不知道如何过滤和排序。 因此,如果有人有一些想法,欢迎分享 对不起,英语不好 当做 Salesh您要做的

基本上我有两个模式,一个是另一个的子文档。 从我的数据表中,我得到了参数。如筛选器、页面限制、页面、排序

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

我试过这样的东西

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

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

对不起,英语不好 当做
Salesh

您要做的不是
查找满足数组条件的文档,而是修改结果以满足您的需要。您可以使用两种方法完成此操作,具体取决于您希望在何处完成处理:

1.处理在数据库中完成。 聚合管道是确定文档查询和转换过程的一系列步骤。 一个粗略的未经测试(可能在语法上是错误的)示例是:

b = await A.find({'_id' : idA}, 
    { 'bs' : 
        { $slice: [ offset * limit, limit ]
        }
    }); 
2.按Id获取文档并在服务器上处理数组。 在这里,您受到javascript及其数组功能的限制

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

谢谢你的贡献。所以基本上是这样的。我有模式契约,我想在我的数据表中显示模式契约拥有的所有文档(对象数组),所以基本上我不需要模式契约,我只需要按id查找契约,获取他的“文档”并排序/过滤/限制/跳过它们……我列出的两个选项都可以做到这一点。只需替换名称并根据MongDB docs示例调整语法即可。获取“无法识别的管道阶段名称:'$filter'=>我应该有$project或类似的东西吗?没错,$filter聚合是在$project内完成的。好吧,我这样做了,但仍然可以从前面的{“name”:“-1”}获取示例当我不能将$sort放入筛选器时,我应该将其放在哪里,例如,我应该将搜索筛选器{“name”:“/d”}(其regexp生成此/d)放在哪里
const found = A.findById('id');
const bs = A.bs.filter( /* filter function */ ).slice() // ... whatever you want.
A.bs = bs;
return A;