Как удалить одну строку из массива в коллекции mongoDB - PullRequest
0 голосов
/ 19 марта 2020

У меня есть коллекция запросов, ее структура выглядит следующим образом

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

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

-Спасибо заранее

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

Сначала я вставил данные в свою коллекцию с именем Employee, а затем записал запрос в виде:

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

enter image description here

Логические значения upsert и multi вы можете проверить в документации. И я просто хочу предложить вам использовать ObjectId на вашем _id выше QUERIES array.

0 голосов
/ 19 марта 2020

Ваше требование неясно.

Если вы хотите удалить элемент 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" } } }
)
0 голосов
/ 19 марта 2020

Ошибка означает, что вы не можете добавить идентификатор документа для просмотра основных документов в коллекции. Поэтому, чтобы избежать этого, вы можете пройти, используя _id родительского документа.

Попробуйте этот запрос:

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

Если вы все еще хотите перемещаться по документу, используя идентификатор вспомогательного документа, попробуйте следующее:

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