通过 mongo 聚合管道使用 $match 两次

Posted

技术标签:

【中文标题】通过 mongo 聚合管道使用 $match 两次【英文标题】:Using $match twice through mongo aggregation pipeline 【发布时间】:2018-03-21 18:26:39 【问题描述】:

我在尝试从 mongoDB 聚合管道中获取一些结果时遇到了一个问题。 这是我的数据库的样子:

var dbSchema = mongoose.Schema(
    identity: Number,
    parametres: 
        style: 
            fuel: [styleSchema],
            gasoline: [styleSchema],        
            ,
        ,

这就是 styleSchema 的样子:

var styleSchema = new mongoose.Schema(
   date: Date,
   value: Number,
   type: String,
);

我正在尝试提取“燃料”和“汽油”中属于某种“类型”的所有对象。

我尝试使用 concatArray 将它们分组到一个唯一数组中,然后通过以下方式匹配我想要的“类型”:

db.aggregate([

  $match:
      'identity':3,
   ,
  $project: all: $concatArrays: ['$parametres.style.fuel','$parametres.style.gasoline'] ,

  $match: '$all.type': 'example',

在尝试第二次匹配之前,我有一个唯一的数组('all'),我尝试匹配它上面的一些东西,但没有任何效果(我也尝试过'all.type').. .

由于我是初学者,我可能误解了我必须使用“匹配”查询的方式,所以感谢您的时间和您的回答,

亚瑟

【问题讨论】:

【参考方案1】:
db.aggregate([
        
            $match:identity:3
        ,
       
            $project: all: $concatArrays: ['$parametres.style.fuel','$parametres.style.gasoline'] 
       ,
       $unwind: "$all",
       $match: "all.type": 'example',
       $group : _id: null, all:$push:"$all"
    ])

您可能正在尝试做这样的事情。 在聚合操作中,$ 用于: 右侧提及字段名称,左侧用于提及运算符。 因此,当您在左侧使用“$all.type”时,MongoDB 会将其视为 Mongodb 运算符列表中不可用的运算符。

另一件事是,当您对array 进行任何查询时。如果至少有一个元素与条件匹配,Mongodb 会发回完整的数组。所以我们需要在进行任何查询之前使用$unwind 运算符来解构数组。

【讨论】:

以上是关于通过 mongo 聚合管道使用 $match 两次的主要内容,如果未能解决你的问题,请参考以下文章

GroupBy 聚合,包括 mongo 中的缺失日期

mongodb Aggregation聚合操作之$sort

MongoDB——聚合管道之$match和$count操作

C ++写入mongo,字符串字段在聚合管道中不起作用

MongoDB $geoNear 聚合管道(使用查询选项和使用 $match 管道操作)给出不同的结果

在 mongo 聚合中使用当前文档键