Mongodb阵列投影

vojdkbi0  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(164)

我在mongo集合中有一组文档,它们的模式如下所示:

{
   "itemIds":{
      "12341234-1234-1234-1234-123412341234": true,
      "23452345-2345-2354-2345-234523452354": false,
      "34563456-3456-3456-3456-345634563456": true
   }
}

由于我们要转向Azure认知搜索,我需要使用mongo投影来获得如下所示的数据:

{
   "itemIds": ["12341234-1234-1234-1234-123412341234",
               "34563456-3456-3456-3456-345634563456"]
}

应排除值为false的属性,并将值为true的属性转换为数组值。

lhcgjxsq

lhcgjxsq1#

选项1。可能是这样的:

db.collection.aggregate([
{
"$addFields": {
  "itemIds": {
    "$filter": {
      "input": {
        "$objectToArray": "$itemIds"
      },
      "as": "item",
      "cond": {
        $eq: [
          "$$item.v",
          true
        ]
      }
    }
  }
  }
 },
 {
  $project: {
    _id: "$_id",
    itemIds: "$itemIds.k"
  }
 }
])

解释道:
1.在addFileds阶段,将对象转换为数组,以获取k,v形式的键/值,这样您就可以只过滤真值。
1.在项目阶段,项目itemIds数组中的_id和itemIds.k值
Playground1

**选项2。**通过单级实现更快的选项:添加字段/$Map/$过滤器:

db.collection.aggregate([
{
"$addFields": {
  "itemIds": {
    "$map": {
      "input": {
        "$filter": {
          "input": {
            "$objectToArray": "$itemIds"
          },
          "as": "item",
          "cond": {
            $eq: [
              "$$item.v",
              true
            ]
          }
        }
      },
      "as": "it",
      "in": "$$it.k"
    }
   }
  }
 }
])

解释道:
将ObjectToArray中的筛选值Map到addFields中,只投影必要的数组值。
Playground2

相关问题