【问题标题】:How to $unset a embedded field MongoDB?如何 $unset 一个嵌入式字段 MongoDB?
【发布时间】:2021-12-02 18:39:07
【问题描述】:

以我的文档为例:

[{
  _id: ObjectId("609391f436e519039a634311"),
  name: "Class A",
  numOfStudents: 10,
  students: [{
    name: "Student A",
    age: 10,
  }, {
    name: "Student B",
    age: 10,
  }]
}]

我想更新班级的一些值并删除班级所有学生的一些信息。所以我在 updateOne 中使用了 $set 和 $unset,如下所示:

db.class.updateOne({
  _id: ObjectId("609391f436e519039a634311")
}, {
  $set: { something: "Something for describe" },
  $unset: { "students.$[].age": "" }
})

但是现在,我想通过另一个字段的值将值设置为某个值,我必须将上面的脚本转换为如下所示的管道:

db.class.updateOne({
  _id: ObjectId("609391f436e519039a634311")
}, [
  {
    $set: { something: "$name" },
  }, {
    $unset: [
      "students.$[].age"
    ]
  }
])

但它不起作用,它抛出了一个错误: Invalid $unset :: caused by :: FieldPath field names may not start with '$'. Consider using $getField or $setField.

请给我一个建议。

【问题讨论】:

    标签: mongodb mongoose aggregate


    【解决方案1】:

    您不能在聚合中使用我们在更新运算符中使用的路径。 聚合时只能使用聚合运算符,唯一的例外是匹配阶段也可以使用查询运算符。

    查询1

    • 未设置年龄

    Test code here

    update(
    {"_id": ObjectId("609391f436e519039a634311")},
    [{"$set": {"something": "$name"}},
     {"$unset": ["students.age"]}])
    

    查询2

    • 您可以使用"$$REMOVE" 系统变量,如果字段获取此值,则将其删除
    • 这就像将所有年龄字段设置为具有值 $$REMOVE 所以它们被删除

    Test code here

    update(
    {"_id": ObjectId("609391f436e519039a634311")},
    [{"$set": {"something": "$name", "students.age": "$$REMOVE"}}])
    

    查询3

    • 对于学生,我们只保留 name(=> age 已删除)
    • 您必须手写所有要保留的字段

    Test code here

    update(
    {"_id": ObjectId("609391f436e519039a634311")},
    [{"$set": {"something": "$name",
               "students": 
                 {"$map": {"input": "$students", "in": {"name": "$$this.name"}}}}}])
    

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 2019-02-13
      • 2018-07-26
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2019-08-12
      • 2018-11-25
      • 2015-06-24
      相关资源
      最近更新 更多