簡體   English   中英

如何從 mongoDB 集合中的數組中刪除一行

[英]How delete one row from an array in mongoDB collection

我有一個查詢集合,它的結構是這樣的

{
        "_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"
})

-提前致謝

錯誤意味着您不能通過子文檔 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')
        }
    }
)

首先,我將數據插入到名為Employee集合中,然后將查詢編寫為:

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

布爾值是upsertmulti您可以在文檔中查看。 我只想建議您在QUERIES array上方的_id處使用ObjectId

你的要求不是很清楚。

如果您想刪除第一個元素而不管內容如何,​​那么解決方案是

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" } } }
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM