【问题标题】:Updating a collection inside array of collections in MongoDB在 MongoDB 中更新集合数组中的集合
【发布时间】:2017-03-06 21:13:33
【问题描述】:

我的 MongoDB 中有一个 mongo 集合 workspaces,其中包含如下所示的记录:

{
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"),
    "name" : "My workspace",
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"),
    "uploads" : [ 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.tif"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.tif"
        }
    ]
}

现在我的目标是我想在数组uploads 的记录之一中附加一些内容,匹配标准为original 字段值。例如,我想通过以下方式将"pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif" 附加到{"original" : "DE-20__450_GG_5002_N23_994__0136.tif"} 集合中:

{
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"),
    "name" : "Objective",
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"),
    "uploads" : [ 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.tif",
            "pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.tif"
        }
    ]
}

我尝试使用$elemMatch,然后通过以下方式添加$addToSet

db.getCollection('workspaces').update({"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}},{$addToSet:{"uploads.$": {"pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}}})

但它给了我以下错误:

Cannot apply $addToSet to a non-array field. Field named '0' has a non-array type object in the document _id: ObjectId('58bdc4a13504f5ed743ad025')

我认为我制作的查询错误,谁能告诉我哪里出了问题,我该如何解决?

对不起我的英语不好:) 希望你明白我说的。

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    这是正确的语法。您必须使用 $setpostional 运算符才能到达元素。

    db.getCollection('workspaces').update(
    {"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}},
    {$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}})
    

    更多信息在这里https://docs.mongodb.com/manual/reference/operator/update/positional/#update-documents-in-an-array

    您可以简化查询条件。对于单个查询条件,您不需要使用 $elemMatch 运算符。您可以使用点表示法。

    db.getCollection('workspaces').update(
    {"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads.original": "DE-20__450_GG_5002_N23_994__0136.tif"},
    {$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}})
    

    更多信息在这里 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition

    【讨论】:

    • 非常感谢它的工作。非常感谢该链接对理解正确的语法非常有帮助。还要感谢您提供点符号的想法,我不知道我们也可以在集合数组的情况下使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2019-08-10
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多