在mongodb mongoose中过滤和更新嵌入式数组

问题描述 投票:0回答:1

MongoDb模型看起来是这样的。

{
    "_id": {
        "$oid": "5ee269c949c9d58970528d1e"
    },
    "parent": [
        {
            "_id": {
                "$oid": "5ee269c949c9d58970528d1d"
            },
            "uType": "parent",
            "fName": "p1",
            "lName": "p1",
            "num": "123"
        }
    ],
    "child": [
        {
            "_id": {
                "$oid": "5ee269c949c9d58970528d1c"
            },
            "uType": "child",
            "fName": "c1",
            "lName": "c1",
            "num": "8963",
            "email": "[email protected]",
            "gender": "male"
        }
    ]
}

我有一个传入的对象,它的样子是这样的。

{
    "uType":"child",
    "fName": "c2",
    "lName": "c2",
    "num": "98733",
    "email": "[email protected]",
    "invite": {
        "uType": "parent",
        "fName": "p1",
        "lName": "p1",
        "num": "123"
    }
}

我必须对传入的对象进行过滤,从而得到如下的响应--这意味着对于传入的对象,有一个匹配的父对象,但没有一个匹配的子对象。

我试过使用$or,并提供了多个条件,但每次都在子数组中得到一条记录。我也试过使用aggregation,但找不到可能的解决方案。谁能告诉我什么是最好的方法?

{
    "_id": {
        "$oid": "5ee269c949c9d58970528d1e"
    },
    "parent": [
        {
            "isActive": false,
            "_id": {
                "$oid": "5ee269c949c9d58970528d1d"
            },
            "uType": "parent",
            "fName": "p1",
            "lName": "p1",
            "num": "123"
        }
    ],
    "child": [ ]
}

更新: 尝试使用投影,但仍然没有结果 ----------------。

Model.aggregate([
            {
                $project: {
                    child: {
                        $filter: {
                            input: "$child",
                            as: "ch",
                            cond: { $eq: ["$ch.num", this.num] }
                        }
                    }
                }
            }
        ])
mongodb mongoose mongoose-schema subdocument
1个回答
0
投票

事实上,你是 所以 接近解决方案,如果你使用 "$$ch.num" 而不是 "$ch.num" 它应该可以工作。

const match = {
    "uType":"child",
    "fName": "c2",
    "lName": "c2",
    "num": "98733",
    "email": "[email protected]",
    "invite": {
        "uType": "parent",
        "fName": "p1",
        "lName": "p1",
        "num": "123"
    }
}
Model.aggregate([
  {
    $match: {
      $or: [
        {
          "parent.num": match.invite.num
        },
        {
          "child.num": match.num
        }
      ]
    }
  },
  {
    $project: {
      parent: {
        $filter: {
          input: "$parent",
          as: "p",
          cond: {
            $eq: [
              "$$p.num",
              match.invite.num
            ]
          }
        }
      },
      child: {
        $filter: {
          input: "$child",
          as: "ch",
          cond: {
            $eq: [
              "$$ch.num",
              match.num
            ]
          }
        }
      }
    }
  }
])

但你也可以在没有聚合的情况下做类似的事情,但当没有匹配时,你不会得到一个空数组,你只是没有得到键。

Model.find({
  $or: [
    {
      "parent.num": match.invite.num
    },
    {
      "child.num": match.num
    }
  ]
},
{
  parent: {
    $elemMatch: {
      num: match.invite.num
    },
  },
  child: {
    $elemMatch: {
      num: match.num
    }
  }
})
© www.soinside.com 2019 - 2024. All rights reserved.