【问题标题】:Filter, sort, limit, skip subdocument mongoose过滤、排序、限制、跳过子文档猫鼬
【发布时间】:2019-05-31 12:17:01
【问题描述】:
const A = mongoose.Schema({
...
    bs: [B.schema],
...

 });

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

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

我试过这样的

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

它正在工作,但我仍然无法弄清楚如何过滤和排序。 所以如果有人有什么想法欢迎分享。

P.S 抱歉英语不好 问候, 销售额

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

    • 感谢您的贡献。所以基本上,看起来像这样。我有模式合同,我想在我的数据表中显示我的模式合同具有的所有文档(对象数组),所以基本上我不需要模式合同,我只需要通过 id 找到合同,获取他的“文档”并排序/过滤/限制/跳过它们......
    • 我列出的两个选项都可以做到这一点。只需根据 MongDB 文档示例替换名称并调整语法即可。
    • 获取“无法识别的管道阶段名称:'$filter' => 我应该有 $project 或类似的东西吗?
    • 你是对的,$filter 聚合是在 $project 中完成的。 docs.mongodb.com/manual/reference/operator/aggregation/filter
    • 好的,我做到了,但是例如我还是从我的fronted { "name" : "-1"} 我不能把他放在过滤器中时应该把$sort放在哪里,同样的例如,我应该在哪里放置我的搜索过滤器 {“name”:“/d”}(它的正则表达式生成这个 /d)
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 2015-10-01
    • 2013-03-20
    • 2023-04-02
    • 1970-01-01
    • 2013-10-21
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多