【问题标题】:MongoDB - Move embedded array element from one document to another documentMongoDB - 将嵌入的数组元素从一个文档移动到另一个文档
【发布时间】:2021-10-25 21:34:17
【问题描述】:

我是一名 Mongodb 初学者。我有一个集合,我想在其中查找并从一个文档中提取一个项目,然后将其推送到同一集合中的另一个匹配文档。

给定:将带有orderNumber: 100itemId: I000007 的项目移动到orderNumber: 102 项目数组

下面是订单集合。

/* 1 */
{
    "_id" : ObjectId("61264e2dc0e8b5b3daa16c9a"),
    "orderNumber" : "100",
    "__v" : 0,
    "items" : [ 
        {
            "itemId" : "I000005",
            "region" : [ 
                "US", 
                "EUROPE"
            ]
        }, 
        {
            "itemId" : "I000006",
            "region" : []
        }, 
        {
            "itemId" : "I000007",
            "region" : [
                "JAPAN"
            ]
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("61268283c0e8b5b3daa1f245"),
    "orderNumber" : "101",
    "__v" : 0,
    "items" : [ 
        {
            "itemId" : "I000008",
            "region" : []
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("61268283c0e8b5b3daa1fg3c"),
    "orderNumber" : "102",
    "__v" : 0,
    "items" : [ 
        {
            "itemId" : "I000009",
            "region" : []
        }
    ]
}

执行查询后,我想要以下结果。

/* 1 */
{
    "_id" : ObjectId("61264e2dc0e8b5b3daa16c9a"),
    "orderNumber" : "100",
    "__v" : 0,
    "items" : [ 
        {
            "itemId" : "I000005",
            "region" : [ 
                "AMRS", 
                "APAC"
            ]
        }, 
        {
            "itemId" : "I000006",
            "region" : []
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("61268283c0e8b5b3daa1f245"),
    "orderNumber" : "101",
    "__v" : 0,
    "items" : [ 
        {
            "itemId" : "I000008",
            "region" : []
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("61268283c0e8b5b3daa1fg3c"),
    "orderNumber" : "102",
    "__v" : 0,
    "items" : [
        {
            "itemId" : "I000009",
            "region" : [],
        },
        {
            "itemId" : "I000007",
            "region" : [
                "JAPAN"
            ]
        }
    ]
}

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您必须执行两个查询才能执行您的操作,

    0) 先决条件:

    let pullOrderNumber = "100";
    let itemId = "I000007";
    let pushOrderNumber = "102";
    

    1) 使用条件从items 数组中拉取项目:

    • 查询将执行该操作,但将返回一个旧文档,因为我们使用了findOneAndUpdate 方法,我们需要将该项目推入另一个文档
    let oldDoc = await Model.findOneAndUpdate(
      { orderNumber: pullOrderNumber },
      {
        $pull: {
          items: { itemId: itemId }
        }
      }
    );
    

    Playground

    2) 过滤并从上述结果文档中找到移除的item对象

    let pushItem = oldDoc.items.find(i => i.itemId == itemId);
    

    3)将上面拉取的项目推入另一个文档

    await Model.updateOne(
      { orderNumber: pushOrderNumber },
      {
        $push: {
          items: pushItem
        }
      }
    );
    

    Playground

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2019-10-08
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2012-11-22
      • 2017-05-13
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多