【问题标题】:Mongo DB Remove Field in Array inside an ArrayMongodb删除数组中的字段
【发布时间】:2020-03-19 06:29:36
【问题描述】:

我的文档结构如下:

{
    "daily": [
        {
            "general": [
                {
                    "status": false,
                    "_id": "5e728265f4796c0017203662",
                    "title": "Sport"
                },...
            ]
        }
    ]
}

我想通过它的“_id”拉出“general”数组中的文档。

我尝试了几件事,但似乎没有什么对我有用。

每一个帮助将不胜感激:)

【问题讨论】:

  • 你能发布你迄今为止尝试过的代码吗?
  • 应该是什么反应?
  • 先生成ObjectId,然后更新就容易了
  • 我不想回复。我只想删除“通用”数组@Kun 中的嵌入文档

标签: node.js mongodb server backend


【解决方案1】:

使用_id从嵌套数组字段general拉取子文档的更新查询:

ID = "5e728265f4796c0017203662"

db.collection.update(
 { "daily.general._id": ID },
 { $pull: { "daily.$.general": { _id: ID } } }
)

【讨论】:

  • 字段_id 通常是ObjectId,所以我认为应该是ID = ObjectId("5e728265f4796c0017203662")
【解决方案2】:

这只能在 Mongo 4.2+ 中完成,他们在其中引入了pipeline'd updates

现在我们可以使用聚合表达式来更新文档:

db.collection.updateOne(
    {},
    [
        {
            $set: {
                "daily": {
                    $map: {
                        input: "$daily",
                        as: "item",
                        in: {
                            "general": {
                                $filter: {
                                    input: "$$item.general",
                                    as: "datum",
                                    cond: {$ne: ["$$datum._id", "5e728265f4796c0017203662"]}
                                }
                            }
                        }
                    }
                }
            }
        }
    ]);

或者,如果日常的对象不仅仅是一般领域,你可以这样做:

db.collection.updateOne(
    {},
    [
        {
            $set: {
                "daily": {
                    $map: {
                        input: "$daily",
                        as: "item",
                        in: {
                            $mergeObjects: [
                                "$$item",
                                {
                                    "general": {
                                        $filter: {
                                            input: "$$item.general",
                                            as: "datum",
                                            cond: {$ne: ["$$datum._id", "5e728265f4796c0017203662"]}
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    ]);

不幸的是,对于任何其他 Mongo 版本,这是不可能的,您必须重组数据或在代码中进行。

【讨论】:

  • 没有聚合表达式是可能的,见上面的答案(甚至更短)。
  • 不,不是,因为答案的长度何时是正确与否的指标?随意使用“简短”的答案。我觉得它不会起作用。
  • prasad_ 的代码要短得多。您的代码工作正常,但您的声明“这只能在 Mongo 4.2+ 中完成,他们在其中引入了管道更新。”是错的。 $[<identifier>] 在 Mongo 3.6 中引入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多