提问者:小点点

MongoDB-将嵌入的数组元素从一个文档移动到另一个文档


我是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"
            ]
        }
    ]
}

共1个答案

匿名用户

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

0)预先需要的东西:

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

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

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

游乐场

2)从上述结果文档中筛选并找到被移除的item对象

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

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

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

游乐场