Arrays 在MongoDB中的集合数组中更新集合

Arrays 在MongoDB中的集合数组中更新集合,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,我的MongoDB中有一个mongo集合工作区,它由如下记录组成: { "_id" : ObjectId("58bdc4a13504f5ed743ad025"), "name" : "My workspace", "user_id" : ObjectId("58b6cf53988a874af070fd3b"), "uploads" : [ { "original" : "DE-20__450_GG_5002_N23_994

我的MongoDB中有一个mongo集合
工作区
,它由如下记录组成:

{
    "_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"
        }
    ]
}
现在,我的目标是在数组
上传
的某个记录中附加一些内容,匹配条件为
原始
字段值。例如,我想将
“pseg:“DE-20_u450_GG_5002_N23_994_u0136.pseg.tif”
附加到
{“原件”:“DE-20_u450_GG_5002_N23_994_u0136.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"
        }
    ]
}
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"}}})
我尝试使用
$elemMatch
,然后以以下方式添加了
$addToSet

{
    "_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"
        }
    ]
}
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')
我想我的查询做错了。有人能告诉我哪里出了问题,我怎么解决吗


对不起,我的英语不好:)希望你能理解我说的话。

这是正确的语法。您必须将
$set
positional
运算符一起使用才能到达元素

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"}})
更多信息请点击此处

您可以简化查询条件。对于单个查询条件,不需要使用
$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"}})
更多信息请点击此处

非常感谢它的工作。非常感谢这个链接,它对理解正确的语法非常有帮助。还感谢你给点符号的想法,我不知道我们也可以在集合数组的情况下使用它。