MongoDB选择可选字段或默认值(如果存在)

tf7tbtn2  于 2023-04-20  发布在  Go
关注(0)|答案(1)|浏览(149)

我尝试选择一个具有一些可选i18 n属性文档。
这意味着我喜欢接收文档的一些属性,如果存在“本地化”属性的所有“de”属性。
为了更好地理解,DB中的文档如下所示。

{
  "_id" : ObjectId("643926af14c8821ad40f8b47"),
  "price" : 1.256,
  "vendor" : "Any Company",
  "blocked" : false
  "localized" : {
        "en" : {
          "name" : "water carafe",
          "description" : "Contents: 1x ... up closure."
        },
        "de" : {
          "name" : "Wasserkaraffe",
          "description" : "Inhalt: 1x ... up-Verschluss."
        },
        "nm" : {
          "name" : "Lorem ipsum dolor sit amet",
          "description" : "At vero eo ... o duo dolores."
        }
    },
  "PropertyB" : 124,
  "SomePropertyC" : "importen property"
}

但我只对这个感兴趣:

{
  "_id" : ObjectId("643926af14c8821ad40f8b47"),
  "price" : 1.256,
  "localized" : {
        "de" : {
          "name" : "Wasserkaraffe",
          "description" : "Inhalt: 1x ... up-Verschluss."
        }
    }
}

主要的问题是,我只想选择几个根字段和“de”字段。如果“de”不可用,则应选择并返回“en”。如果两种情况都不存在,则应返回第一个最佳字段,这将是令人难以置信的。最后,我将文档转换为flattet新文档
在最后

{
  "_id" : ObjectId("643926af14c8821ad40f8b47"),
  "price" : 1.256,
  "localized" : {
        "de" : {
          "name" : "Wasserkaraffe",
          "description" : "Inhalt: 1x ... up-Verschluss."
        }
    }
}

最后,我将文档转换为一个新的文档。显然,$project(aggregation)是为此提供的。到目前为止,这工作得很好。但是,对文档的查询对我来说是不可能的。
有人知道这是怎么回事吗?

w8rqjzmb

w8rqjzmb1#

db.collection.aggregate([
  {
    $project: {
      price: 1,
      localized: {
        $cond: {
          if: { $not: [ "$localized.de" ] },
          then: { en: "$localized.en" },
          else: { de: "$localized.de" }
        }
      }
    }
  }
])

playground
如果“de”和“en”都缺失,那么我们取沿着的第一个。

db.collection.aggregate([
  {
    $project: {
      price: 1,
      localized: {
        $cond: {
          if: { $not: [ "$localized.de" ] },
          then: { "$cond": {
              if: { $not: [ "$localized.en" ] },
              then: { $arrayToObject: { $slice: [{ $setUnion: { $objectToArray: "$localized" }}, 1]}},
              else: { en: "$localized.en" }
            }
          },
          else: { de: "$localized.de" }
        }
      }
    }
  }
])

playground

相关问题