MongoDB判断数组对象字段非空语法

小豆丁 1月前 ⋅ 55 阅读
聊天记录
头像

mong判断subOrderList列表的某个对象存在goodsRemark 字段不为空语法?

头像

在MongoDB中,判断subOrderList列表中某个对象的goodsRemark字段不为空,有以下几种写法:

1. 判断字段存在且不为null

JAVASCRIPT
// 使用 $exists 和 $ne
db.collection.find({
  "subOrderList": {
    "$elemMatch": {
      "goodsRemark": { "$exists": true, "$ne": null }
    }
  }
})

2. 判断字段存在且不为null和空字符串

JAVASCRIPT
// 如果还排除空字符串
db.collection.find({
  "subOrderList": {
    "$elemMatch": {
      "goodsRemark": { 
        "$exists": true, 
        "$ne": null,
        "$ne": ""  // 可选,排除空字符串
      }
    }
  }
})

3. 使用聚合管道判断

JAVASCRIPT
// 使用聚合管道
db.collection.aggregate([
  {
    $match: {
      "subOrderList": {
        $elemMatch: {
          "goodsRemark": { $exists: true, $ne: null }
        }
      }
    }
  }
])

4. 在聚合中筛选包含该字段的文档

JAVASCRIPT
// 返回时只显示符合条件的数组元素
db.collection.aggregate([
  {
    $match: {
      "subOrderList.goodsRemark": { $exists: true, $ne: null }
    }
  },
  {
    $project: {
      "filteredSubOrders": {
        $filter: {
          input: "$subOrderList",
          as: "order",
          cond: { 
            $and: [
              { $ne: ["$$order.goodsRemark", null] },
              { $ne: ["$$order.goodsRemark", ""] }  // 可选
            ]
          }
        }
      }
    }
  }
])

5. 简洁写法(适用于简单查询)

JAVASCRIPT
// 如果只判断不为null
db.collection.find({ "subOrderList.goodsRemark": { $ne: null } })

// 如果同时排除null和空字符串
db.collection.find({ 
  "subOrderList.goodsRemark": { 
    $nin: [null, ""]  // 排除null和空字符串
  } 
})

示例数据

JAVASCRIPT
// 示例数据
{
  "_id": 1,
  "subOrderList": [
    { "orderId": "A1", "goodsRemark": "备注信息" },  // 符合条件
    { "orderId": "A2", "goodsRemark": null },       // 不符合
    { "orderId": "A3" }                             // 不符合(字段不存在)
  ]
}
{
  "_id": 2,
  "subOrderList": [
    { "orderId": "B1", "goodsRemark": "" },         // 不符合(空字符串)
    { "orderId": "B2" }                             // 不符合
  ]
}

使用建议

  • 如果只是简单判断是否存在且不为null,使用第5种的简洁写法
  • 如果需要更复杂的判断条件,使用$elemMatch
  • 如果要在结果中过滤数组,使用聚合管道
  • 注意区分null""(空字符串)和字段不存在的区别

全部评论: 0

    我有话说: