MongoDB-如何仅在存在的字段上使用$ ifNull

时间:2019-01-10 08:39:56

标签: javascript mongodb

我正在使用$lookup,它可能会也可能不会返回某些内容。但是,如果需要,我需要检查查找的值并检查特定字段以查看其是否为空,如果是,请将其设置为某些值。

我尝试过:

{
    $lookup:
    {
        from: 
            "item_templates",
        localField:
            "based_on",
        foreignField:
            "_id",
        as:
            "template"
    }
},
{
    $addFields:
    {
        "template.image.url":
        {
            $ifNull:
            [
                "$template.image.url",
                "http://via.placeholder.com/400x700/d3d3d3/000000/?text=No%20Image&"                                        
            ]
        }
    }
},

但是它似乎对template.image.url(这是一个对象数组)没有影响,实际上它返回一个数组,其中一个元素为null

2 个答案:

答案 0 :(得分:1)

您可以使用更新的$lookup语法来达到预期的结果

db.collection.aggregate([
  { "$lookup": {
    "from": "item_templates",
    "let": { "based_on": "$based_on" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$based_on"] }}},
      { "$addFields": {
        "image.url": {
          "$ifNull": [
            "$image.url",
            "http://via.placeholder.com/400x700/d3d3d3/000000/?text=No%20Image&"
          ]
        }
      }}
    ],
    "as": "template"
  }}
])

答案 1 :(得分:0)

尝试使用$project

{
   $unwind:{
       path: "$template",
       includeArrayIndex: "arrayIndex",
       preserveNullAndEmptyArrays: true
   }
},
{
   $project:{
     template.image.url: { 
        $ifNull: [ 
             "$template.image.url", 
              "http://via.placeholder.com/400x700/d3d3d3/000000/?text=No%20Image&" 
       ]
      },
   }
}