代码之家  ›  专栏  ›  技术社区  ›  CESAR NICOLINI RIVERO

如何在MongoDB上执行“$all$in”?

  •  1
  • CESAR NICOLINI RIVERO  · 技术社区  · 8 年前

    我有以下收藏

    >db.prueba.find({})
    { "_id" : "A", "requi" : null }
    { "_id" : "B", "requi" : null }
    { "_id" : "C", "requi" : [ "A" ] }
    { "_id" : "D", "requi" : [ "A", "B" ] }
    { "_id" : "E", "requi" : [ "C" ] }
    { "_id" : "F", "requi" : [ "B", "D"] }
    { "_id" : "G", "requi" : [ "F" ] }
    

    我需要requi字段的每个元素都在下面的数组中。在这种情况下,数组只有一个元素

    ["A", "D"]
    

    当我用接线员的时候 $all $in 返回以下内容

     >db.prueba.find({requi:{$elemMatch:{$in:['A','D']}}})
    { "_id" : "C", "requi" : [ "A" ] }
    { "_id" : "D", "requi" : [ "A", "B" ] }
    { "_id" : "F", "requi" : [ "B", "D" ] }
    

    查询必须只返回文档,因为 'B' 数组中不存在 ["A" , "D"]

    { "_id" : "C", "requi" : [ "A" ] }
    

    求你了,帮帮我

    1 回复  |  直到 8 年前
        1
  •  1
  •   Ashh    8 年前

    你可以用 $setIsSubset 检查给定数组是否是 requi 数组,然后 $redact 消除不匹配的。

    db.collection.aggregate([
      { "$match": { "requi": { "$ne": null } } },
      { "$redact": {
        "$cond": {
          "if": { "$eq": [{ "$setIsSubset": ["$requi", ["A", "D"]] }, true] },
          "then": "$$DESCEND",
          "else": "$$PRUNE"
        }
      }}
    ])