簡體   English   中英

Mongo查找子文檔數組中的任何可能字段是否具有值

[英]Mongo find if any possible field in array of subdocuments has value

我在Collection上運行aggregate ,並使用對另一個子Collection的查找。

每個孩子可能有也可能沒有可以包含String的字段 ( foo )。

我想project一個Boolean ,如果這些field中的至少一個具有任何子子subdocumentsString

所以我可以有類似的東西

db.Parent.aggregate([
  {
    '$lookup': {
      'from': 'Children', 
      'localField': '_id', 
      'foreignField': 'parentId', 
      'as': 'CHILDREN'
    }
  }, {
     childHasFoo: {
         "$CHILDREN" : {$elemMatch: {foo: {$ne: ''}}}
     }
}
]

你可以看到我對childHasFoo的投影。 我想我可以使用$elemMatch$anyElementTrue 請記住, foo也可能不存在於一個/所有subdocuments中。 所以需要考慮到這一點。

謝謝!

  • 使用$map數組運算符迭代CHILDREN數組的循環,
  • 使用$ne檢查您的狀況,這將返回 boolean 值
  • $anyElementTrue檢查任何元素是否為真
  {
    $addFields: {
      childHasFoo: {
        $anyElementTrue: {
          $map: {
            input: "$CHILDREN",
            in: { $ne: ["$$this.foo", ""] }
          }
        }
      }
    }
  }

第二個選擇更准確的條件,

  • $trim從字符串中刪除空格
  • 要檢查的$not$in是字符串空 "" 或null然后為 false 否則為 true
  {
    $addFields: {
      childHasFoo: {
        $anyElementTrue: {
          $map: {
            input: "$CHILDREN",
            in: {
              $not: {
                $in: [
                  { $trim: { input: "$$this.foo" } },
                  ["", null]
                ]
              }
            }
          }
        }
      }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM