Извлечение элементов из массива mongodb - PullRequest
0 голосов
/ 25 июня 2018

У меня есть вопрос, на который я потратил больше времени, чем следовало бы, и, похоже, я не понимаю, что делаю неправильно.

У меня есть документ ниже в MongoDB:

{
    "personal": {
        ...
    },
    "preferences": {
        ....
    },
    "_id": "5b2efdad564191054807c2b1",
    "pets": [],
    "conversations": [
        {
            "unread": 1,
            "participants": [
                {
                    "_id": "5b2efdcd564191054807c2b2",
                    "name": "Mighty Jules"
                }
            ],
            "messages": [
                {
                    "sender": "self",
                    "timestamp": "2018-06-24T12:29:50.656Z",
                    "_id": "5b2f8ebede342a12a8dcc9d2",
                    "text": "..."
                },
                {
                    "sender": "self",
                    "timestamp": "2018-06-24T12:29:58.022Z",
                    "_id": "5b2f8ec6de342a12a8dcc9d8",
                    "text": "..."
                },
                {
                    "sender": "5b2efdcd564191054807c2b2",
                    "timestamp": "2018-06-24T12:30:27.562Z",
                    "_id": "5b2f8ee3de342a12a8dcc9e5",
                    "text": "..."
                },
                {
                    "sender": "self",
                    "timestamp": "2018-06-24T12:32:48.034Z",
                    "_id": "5b2f8f70d3a83e25bc1abbb2",
                    "text": "..."
                },
                {
                    "sender": "self",
                    "timestamp": "2018-06-24T12:36:20.027Z",
                    "_id": "5b2f9044d4137828283c5a60",
                    "text": "..."
                },
                {
                    "sender": "5b2efdcd564191054807c2b2",
                    "timestamp": "2018-06-24T12:37:39.965Z",
                    "_id": "5b2f90939b4b2a4af8cf50db",
                    "text": "..."
                }
            ],
            "last_message": "2018-06-24T12:37:39.965Z",
            "_id": "5b2efdcd564191054807c2b2"
        },
        {
            "unread": 1,
            "participants": [
                {
                    "_id": "5b300ff657957c1aa0ed0576",
                    "name": "Super Frank"
                }
            ],
            "messages": [
                {
                    "sender": "5b300ff657957c1aa0ed0576",
                    "timestamp": "2018-06-24T21:42:49.392Z",
                    "_id": "5b30105957957c1aa0ed0583",
                    "text": "..."
                }
            ],
            "last_message": "2018-06-24T21:42:49.392Z",
            "_id": "5b300ff657957c1aa0ed0576"
        }
    ],
    "created_date": "2018-06-24T02:10:53.314Z",
    "lastLogin_date": "2018-06-24T02:10:53.314Z",
    "lastUpdate_date": "2018-06-25T02:09:53.281Z",
    "__v": 0
}

Я пытаюсь удалить только пару сообщений с помощью mongoose:

const user = await User.findOneAndUpdate(
    {
        _id: mongoose.Types.ObjectId("5b2efdad564191054807c2b1"), //Which is the one that doc
        "conversations._id": mongoose.Types.ObjectId("5b2efdcd564191054807c2b2")
    },
    {
        $pull: {
            "conversations.$.messages": {
                $in: [
                    { _id: mongoose.Types.ObjectId("5b2f9044d4137828283c5a60") },
                    { _id: mongoose.Types.ObjectId("5b2f90939b4b2a4af8cf50db") }
                ]
            }
        }
    },
    {
        new: true,
        projection: {
            conversations: 1
        }
    }
);

В ответе я получаю то же самое, ничего не удаляется, я не получаю ошибок.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Прежде всего, _id s в примере документа являются строками, а не ObjectId.Во-вторых, синтаксис $ pull неверен.Пожалуйста, прочитайте https://docs.mongodb.com/manual/reference/operator/update/pull/#remove-items-from-an-array-of-documents. Это должно быть:

{
    $pull: {
        "conversations.$.messages": { 
            "_id": {
                "$in": ["5b2f9044d4137828283c5a60", "5b2f90939b4b2a4af8cf50db"]
            } 
        }
    }
}

Он будет извлекать сообщения из первого соответствующего разговора, если это то, что вы хотите.Если вы хотите удалить сообщения из всех соответствующих разговоров, вам нужно вместо этого использовать $ [] : "conversations.$[].messages"

0 голосов
/ 25 июня 2018
function exists(Arr, objId){
    for(var i = 0; i < Arr.length; i++)
        if(objId.equals(Arr[i]))
            return true    
    return false
}

var user = await User.findOne(
    {_id: mongoose.Types.ObjectId("5b2efdad564191054807c2b1")}
)

for(var j = 0; j<user.conversations.length; j++)
    if(exists([conId],user.conversations[j]._id)
        break

if(j<user.conversations.length)
for(var i =0; i < user.conversations[j].messages.length; i++)
    if(exists(Arr, user.conversations.messages[i]._id))
        delete user.conversations.messages[i]        

user.save()

Редактировать: используя только операции с БД

Если вы хотите использовать $ in, вам нужно будет передать весь подмассив.

await User.update({_id : "5b2efdad564191054807c2b1", "conversations._id" : "5b2efdcd564191054807c2b2" }, { $pull: { "conversations.$.messages":{ $in : [{"sender" : "self", "timestamp" : "2018-06-24T12:32:48.034Z","_id" : "5b2f8f70d3a83e25bc1abbb2","text" : "..."}] } } }, {multi : true} )

что-то вроде этого, поскольку $ in сравнивает весь документ с каждым элементом в массиве.

В вашем случае он не находит соответствия, но все же он успешно завершился в этом процессе и, следовательно, не содержит ошибок.

Если вы хотите сделать только по идентификатору, вам придется проходить по каждому изваши идентификаторы:

for(var i = 0; i < ids.length; i++)
    await User.update({_id : "5b2efdad564191054807c2b1", "conversations._id" : "5b2efdcd564191054807c2b2" }, { $pull: { "conversations.$.messages": {_id : ids[i] } } }, {multi : true} )

или вы знаете поле _id, поэтому используйте его для поиска $ id

await User.update({_id : "5b2efdad564191054807c2b1", "conversations._id" : "5b2efdcd564191054807c2b2" }, { $pull: { "conversations.$.messages":{ "_id" : { $in : ids } } } }, {multi : true} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...