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

时间:2018-03-21 18:26:40

标签: javascript node.js mongodb mongoose mongodb-query

我在尝试从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.type'还)...

我可能误解了我必须使用'匹配'查询我是初学者,所以感谢您的时间和答案,

亚瑟

1 个答案:

答案 0 :(得分:0)

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运算符来解构数组。