【问题标题】:How delete one row from an array in mongoDB collection如何从 mongoDB 集合中的数组中删除一行
【发布时间】:2020-06-30 05:23:30
【问题描述】:

我有一个查询集合,它的结构是这样的

{
        "_id": "5e71fa3ab004192b349e4a06",
        "QUERIES": [
            {
                "_id": "5e71fa3ab004192b349e4a07",
                "QUERY": "1",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a1",
                "createdAt": "2020-03-18T10:38:50.247Z"
            },
            {
                "_id": "5e71fa46b004192b349e4a08",
                "QUERY": "2",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a2",
                "createdAt": "2020-03-18T10:39:02.451Z"
            }
        ],
        "TICKET_ID": "5e70f4fa47df9479502f7937",
        "USER_ID": "5e6f1c5b8451307f782d0994",
        "RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
    }

我想从 QUERIES 数组中删除第一个元素。 预期输出

{
        "_id": "5e71fa3ab004192b349e4a06",
        "QUERIES": [
            {
                "_id": "5e71fa46b004192b349e4a08",
                "QUERY": "2",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a2",
                "createdAt": "2020-03-18T10:39:02.451Z"
            }
        ],
        "TICKET_ID": "5e70f4fa47df9479502f7937",
        "USER_ID": "5e6f1c5b8451307f782d0994",
        "RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
    }

我尝试了以下更新方法,但在 mongoDB Shell 上执行更新方法时出错

db.getCollection("query_masters").update( {'QUERIES._id':ObjectId('5e726996b96d107eac5c88a4')},{$pull: { 'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4') }}
        )

错误信息

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 28,
        "errmsg" : "Cannot use the part (_id) of (QUERIES._id) to traverse the element"
})

-提前致谢

【问题讨论】:

  • 您想删除数组QUERIES 中的first 元素还是删除_id = 5e726996b96d107eac5c88a4 的元素(根本不存在)?

标签: node.js mongodb mongoose mean-stack


【解决方案1】:

首先我将数据插入到名为Employee 的集合中,然后将查询编写为:

db.Employee.update({'_id':("5e71fa3ab004192b349e4a06")}, 
                   {$pull:{"QUERIES": {USER_NAME:"a1"}}},false, true
                  );

布尔值为upsertmulti,您可以在文档中查看。我只是想建议你在_id 上面的QUERIES array 上使用ObjectId

【讨论】:

  • 请不要粘贴图片,请使用格式化文本。
  • 这不会删除“第一个”元素。它会删除 USER_NAME = "a1" 所在的元素,无论它在数组中的哪个位置。
【解决方案2】:

您的要求不明确。

如果你想删除 first 元素无论内容如何,​​那么解决方案是

db.collection.updateMany(
   {},
   { $unset: { "QUERIES.0": "" } }
)

如果数组中的位置不相关,则解决方案是以下之一:

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { QUERY: "1" } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { USER_ID: ObjectId("5e6f1c5b8451307f782d0994") } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { _id: ObjectId("5e6f1c5b8451307f782d0994") } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { USER_NAME: "a1" } } }
)

【讨论】:

    【解决方案3】:

    错误意味着您不能子文档 id 来遍历集合中的主要文档。所以为了避免这种情况,你可以使用父文档的 _id 进行遍历。

    试试这个查询:

    db
    .getCollection("query_masters")
    .update(
        {
            '_id':ObjectId('5e71fa3ab004192b349e4a06')
        },
        {
            $pull: {
                'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
            }
        }
    )
    

    如果您仍想使用子文档 ID 遍历文档,请尝试以下操作:

    db
    .getCollection("query_masters")
    .update(
        {
             "QUERIES": {
                 $elemMatch: {
                     _id: ObjectId('5e726996b96d107eac5c88a4')
                 }
             }
        },
        {
            $pull: {
                'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
            }
        }
    )
    

    【讨论】:

    • 遇到同样的错误Cannot use the part (_id) of (QUERIES._id) to traverse the element
    • @vijaykrishnavanshi 您正在使用ObjectId 但@Sufil 没有提到它是一个ObjectId。相反,他只提到了_id,所以它会导致问题。
    • @vijaykrishnavanshi 对此感到抱歉。我正在使用 ObjectId
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2017-02-21
    • 2021-09-11
    • 2015-09-06
    • 2017-04-11
    相关资源
    最近更新 更多