如何从 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" } } }
)