【问题标题】:Usage mongo aggregate and project使用 mongo 聚合和项目
【发布时间】:2016-10-30 17:12:31
【问题描述】:

我有一个类似的收藏:

{
"_id" : ObjectId("57dc2b63add5c5e91f185fe0"),
"level" : 2,
"profili" : [ 
    {
        "_id" : ObjectId("507f1f77bcf86cd799439011"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"),
        "costopag" : 1,
        "pagmax" : 10,
        "pagmin" : 1
    }, 
    {
        "_id" : ObjectId("507f191e810c19729de860ea"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"),
        "costopag" : 0.5,
        "pagmax" : 100,
        "pagmin" : 11
    }
],
"__v" : 0
},
{
"_id" : ObjectId("57dc39945aec26b303053dd7"),
"level" : 2,
"profili" : [ 
    {
        "_id" : ObjectId("507f1f77bcf86cd799439012"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"),
        "costopag" : 10,
        "pagmax" : 100,
        "pagmin" : 11
    }
]
},
{
"_id" : ObjectId("57e7ff05a0ef6d07c3048d7f"),
"level" : 2,
"profili" : [ 
    {
        "_id" : ObjectId("507f1f77bcf86cd799439013"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498c"),
        "costopag" : 0.5,
        "pagmax" : 10,
        "pagmin" : 1
    }
]
},
{
"_id" : ObjectId("57e7ff54a0ef6d07c3048d81"),
"level" : 2,
"profili" : [ 
    {
        "_id" : ObjectId("507f1f77bcf86cd799439014"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498c"),
        "costopag" : 5,
        "pagmax" : 10,
        "pagmin" : 1
    }
],
"__v" : 0
}

我需要搜索一个具有特定“配置文件”的文档。 如果我执行这个查找:

database.Utente.find({
      "level":2,
      profili: {
        $elemMatch:{
          idprofilo: '57fe3c51569b5c0afb88498b',
          pagmin: {$lte:2},
          pagmax: {$gte:2}
        }
      }
    })

结果是:

{
"_id" : ObjectId("57dc2b63add5c5e91f185fe0"),
"level" : 2,
"profili" : [ 
    {
        "_id" : ObjectId("507f1f77bcf86cd799439011"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"),
        "costopag" : 1,
        "pagmax" : 10,
        "pagmin" : 1
    }, 
    {
        "_id" : ObjectId("507f191e810c19729de860ea"),
        "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"),
        "costopag" : 0.5,
        "pagmax" : 100,
        "pagmin" : 11
    }
],
"__v" : 0
}

如果可能的话,我不会使用 profili.id=507f191e810c19729de860ea,因为它不会应要求做出响应。 我已经读过 .aggregate 和 $project 运算符是否有可能,但我不明白我该怎么做。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您需要在$project 阶段使用aggregate$filter

    db.test.aggregate([
      {
          $match: {
              level: 2
          }
      },
      {
          $project: {
              level: 1,
              profili: {
                  $filter: {
                      input: '$profili',
                      as: 'prof',
                      cond: {
                          $and : [
                              {$eq: ['$$prof.idprofilo', ObjectId('57fe3c51569b5c0afb88498b')]},
                              {$lte: ['$$prof.pagmin', 2]},
                              {$gte: ['$$prof.pagmax', 2]}
                          ]
                      }
                  }
              }
          }
      }
    ])
    

    如果您想删除所有带有空profili 的文档,只需添加另一个$match 阶段:

    {
        $match: {
            profili: { $nin: [[], null] }
        }
    }
    

    【讨论】:

    • 嗨@TomG,代码有效,但为什么还要搜索其他级别?第一个level: 1不是过滤器?如果我只看到level: 1 的结果,我会添加$matchlevel: 1。在我过滤空profili 和空profili 的地方。如果我在$match 添加运算符$or 不起作用。非常感谢您的帮助
    • @Francesco 抱歉,我没有看到您想要过滤 level:2 我已将其添加到第一个 $match。同样对于第二个$match,我更改了它将过滤掉空和空profili
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2015-10-31
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多