【问题标题】:How to push array elements as each in nested array in mongodb using nodejs如何使用nodejs将数组元素作为每个元素推送到mongodb的嵌套数组中
【发布时间】:2018-09-01 13:56:15
【问题描述】:

我想在 mongodb 的嵌套数组中推送数组元素,我正在使用的代码是这样的:

$push:{
    "websites.$.ads":{
        "ad_type":{"$each":["320x40","480x30"]}
    }
}

我有以下架构设计:

_id:KLNkl23klmKLM233mKLM233
websites:[     
    {  
        _id:"xyz"  
        ads:[ 
            ad_type:""  
        ]   
    },
    {  
        _id:"xyz"  
        ads:[ 
            ad_type:""  
        ]   
    }
]                                     

最后我想得到的是

{   
  "_id" : ObjectId("some id"),   
  "websites" : [  
             { 
                 "ads" : [ 
                     { _id:"asdfasdf" , "ad_type" : "some value" },
                     { _id:"asdfasdf" , "ad_type" : "some value" },
                     { _id:"asdfasdf" , "ad_type" : "some value" }  
                 ] 
             } 
   ] 
 }

【问题讨论】:

  • 我不明白你到底需要什么。是不是有点像{“_id”:ObjectId(“some id”),“websites”:[{“ads”:[{“ad_type”:“some value”}]},{“ads”:[{“ad_type” " : "一些值" } ] } ] }
  • 我编辑了上面的问题,请看一下我想要实现的目标

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

您可以使用数组更新的positional argument。我尝试了以下语法以使其正常工作,并在下面输出

db.coll.update({}, {
    $push: {
        'websites.$[].ads': {
            $each: [{
                    _id: 'some_id',
                    ad_type: 'some value'
                }
            ]
        }
    }
})

输出

{
        "_id": ObjectId("SOME_MAIN_ID"),
        "websites": [{
                "ads": [{
                        "_id": "some_id",
                        "ad_type": "some value"
                    }, {
                        "_id": "some_id_1",
                        "ad_type": "some value_1"
                    }
                ]
            }
        ]
    }

EDITED 用于更改数组

db.coll.update({}, {
    $set: {
        'websites.$[].ads': [{
                _id: 'some_id_1',
                ad_type: 'some value_1'
            }
        ]
    }
})
WriteResult({
    "nMatched": 1,
    "nUpserted": 0,
    "nModified": 1
})
db.coll.find() {
    "_id": 'SOME_MAIN_ID',
    "websites": [{
            "ads": [{
                    "_id": "some_id_1",
                    "ad_type": "some value_1"
                }
            ]
        }
    ]
}
db.coll.update({}, {
    $set: {
        ' websites.$[].ads ': [{
                _id: ' some_id_1 ',
                ad_type: ' some value_1 '
            }, {
                _id: ' some_other_id_2 ',
                ad_type: ' some_other_type '
            }
        ]
    }
})

WriteResult({
    "nMatched": 1,
    "nUpserted": 0,
    "nModified": 1
})
db.coll.find() {
    "_id": 'SOME_MAIN_ID',
    "websites": [{
            "ads": [{
                    "_id": "some_id_1",
                    "ad_type": "some value_1"
                }, {
                    "_id": "some_other_id_2",
                    "ad_type": "some_other_type"
                }
            ]
        }
    ]
}

【讨论】:

  • 非常感谢您的回答,但假设我有一个每次都在变化的动态数组,例如 ["someValue","someValue","someValue"] 这些现在都被称为 ad_types我想推动这些中的每一个以获得上面的输出我该怎么做
  • Yes Like ["320x50","video-impressions","720x80"] 等等
  • 我认为这可以通过 $each 实现,但不知道如何
  • 好吧,在这种情况下,您有 2 个选项,要么您首先找到已更改的内容,然后推送到 mongodb,否则因为它一直在更改,有时可能很难找到更改的内容,然后在mongodb中设置完整的数组,更新答案
  • 感谢您的回答,但这不是我想要的,实际上我正在编写一个 nodejs 应用程序,用户将在其中输入他想要的广告名称,可能是 1 2 3 等等我正在做的是获取数组中的所有名称,并希望通过使用 $each 一次推送而不检查它是否已经存在于数组中,或者当前我正在通过使用 forEach 循环并在 ads 数组中逐一推送值来实现这一点在 mongodb 中,但这是个坏主意
猜你喜欢
  • 2018-05-10
  • 2022-12-06
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多