Mongo:使用元素本身更新字符串数组元素的值

时间:2019-04-09 18:32:15

标签: javascript mongodb express

我有一个 express 应用,并且我正在使用 mongodb 满足我的数据库需求。我的收藏结构如下。

馆藏的文件类似于以下文件。

{
    _id: 5caa266c58b170106ff17f40,
    title: "Test2 88 bulkWrite",
    last_save_date: 2019-04-07T17:08:25.149+00:00,
    created_by: "McufNwnQX8YXC0tNSa1fdbt9Tus2",
    stories: [ { story_id: "1", objects: [...] },
               { story_id: "2", objects: [...] },
               { story_id: "3", objects: [...] },
                ... 
             ]    
 }

问题很简单,假设用户单击一个按钮,删除了数组元素{story_id: "2", objects: [...]},而所有story_id都大于“ 2”的元素(sa,“ 3” ,“ 4” ...)减1(分别为“ 2”和“ 3”)。

第一部分(即删除)已完成,但第二部分使我难以理解。 这是代码:

var storyId = ... (fetch from a request);
var intStoryId = parseInt( storyId) ;

var arrayOfHigherNumber = function() {
    var temp = [];
    if ( intStoryId == 5 ) { return temp; }
    for ( var i = intStoryId + 1; i <= 5; i++ ) {
        temp.push( i.toString() );
    }
    return temp;
}

collection.bulkWrite([
// This works and is able to delete the particular story_id entry
    { updateOne: {
        'filter': {'_id' : ObjectID( docId ) },
        'update': { 
            '$pull': { 'stories': { 'story_id': storyId } }
        }
    }},
// This does NOT work. 
    { updateMany: {
        'filter': { '_id': ObjectID( docId ), 'story_id': { '$in': arrayOfHigherNumber() } },
        'update': {
            '$set': { 'stories': { 'story_id': ( parseInt( 'story_id', 10 ) - 1 ).toString() } 
         }
     }
   }}
])

在过去的24小时里,我一直不停地往墙上撞,并且尝试了许多方法,包括NumberInt$int$convert,还有其他一些方法,例如聚合管道,但我无法做到这一点。容易完成似乎很简单,但是a!请注意,story_id是一个字符串,因此使用$inc操作符并不是那么简单。

编辑

Anthony Winzlet的答案是正确的。我的处理方式略有不同,仅此而已。

我的方法

collection.findOneAndUpdate(
    { "_id": ObjectID( docId) },
    { "$pull": { "stories": { "story_id": storyId } } },
    { returnOriginal: false }
)
.then( function( story ) {
    collection.findOneAndUpdate(
        { "_id" : ObjectID( docId ) },
        { "$set": {
            "stories": story.value.stories.map(a => {
                if ( parseInt( a.story_id, 10 ) > parseInt( storyId, 10 ) ) {
                    return { story_id: (parseInt( a.story_id, 10 ) - 1).toString(), objects: a.objects }
                } else {
                    return { story_id: a.story_id , objects: a.objects }
                }
            })
        }}
    )
    .then( function ( result ) {
        response.send( result );
        client.close();
    })
})

2 个答案:

答案 0 :(得分:1)

使用$ cd ~/catkin_ws $ git clone https://github.com/ros-perception/vision_opencv src/vision_opencv $ git clone https://github.com/ros-perception/image_transport_plugins.git src/image_transport_plugins $ catkin_make 的两个操作代替批量查询

async await

答案 1 :(得分:0)

collection.updateMany({story_id:{$ gte:DeletedElementNo}},{$ inc:{story_id:-1}});

我认为这是您正在寻找的那种东西?