在聚合管道中查询嵌入式文档的mongo数组

时间:2017-10-16 13:08:09

标签: arrays mongodb aggregation-framework

我正在研究在聚合管道MongoDB中查询嵌入式文档数组的不同方法。看起来MongoDB对此的支持较少。

我们假设我们在测试集合中有以下文档:

/* 1 */
   {
    "_id" : ObjectId("59df2c39fbd406137d4290b3"),
    "a" : 1.0,
    "arr" : [ 
        {
           "key": 1,
           "sn" : "a",
           "org": "A"
        }
    ]
   }

/* 2 */
{
    "_id" : ObjectId("59df2c47fbd406137d4290b4"),
    "a" : 2.0,
    "arr" : [ 
        {
            "sn" : "b",
            "key": 2,
            "org": "B"
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("59df2c50fbd406137d4290b5"),
    "a" : 3.0,
    "arr" : [ 
        {

           "key": 3,
           "sn" : "c", 
           "org": "C"
        }
    ]
}

/* 4 */
{
    "_id" : ObjectId("59df2c85fbd406137d4290b6"),
    "a" : 1.0,
    "arr" : [ 
        {
           "key": 1,
           "sn" : "a",
           "org": " A"
        }
    ]
}

/* 5 */
{
    "_id" : ObjectId("59df2c9bfbd406137d4290b7"),
    "a" : 3.0,
    "arr" : [ 
        {
            "sn" : "b",
            "key": 2,
        }
    ]
}

/* 6 */
{
    "_id" : ObjectId("59df2e41fbd406137d4290b8"),
    "a" : 4.0,
    "arr" : [ 
        {
            "sn" : "b",
            "key" : 2
        }
    ]
}

/* 7 */
{
    "_id" : ObjectId("59df2e5ffbd406137d4290b9"),
    "a" : 5.0,
    "arr" : [ 
        {
           "key" : 2,
            "sn" : "b"
        }, 
        {
            "sn" : "a",
            "key" : 1
        }
    ]
}

我想根据" arr.sn"对上述文件进行分类。使用以下查询的字段值:

db.test.aggregate([{"$addFields": {"Category" : { $switch: {
     branches : [
       { case : { $eq : [ "$arr.nm", "a" ] }, then : "Category 1"}
    ],
    default : "No Category"
    }}}}])

但是$ eq运算符没有给出正确的结果,如果我在find方法中使用相同的$ eq,它可以工作:

db.test.find({"arr.sn" : "a"})

我正在寻找只使用单个字段的方法,以防万一" arr.sn"领域。有没有办法从数组的嵌入文档中投射字段?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

$eq(aggregation)比较查询eq opeator的值和类型,它们可以比较任何类型的值。

您需要$in(aggregation)来验证数组中的值。

这样的东西
[
  {
    "$addFields": {
      "Category": {
        "$switch": {
          "branches": [
            {
              "case": {
                "$in": [
                  "a",
                  "$arr.sn"
                ]
              },
              "then": "Category 1"
            }
          ],
          "default": "No Category"
        }
      }
    }
  }
]