Как обновить свойство speci c документа на основе условия - PullRequest
0 голосов
/ 04 февраля 2020

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

{
   _id: "1",
   userOneId: "11",
   userOneName: "User One Name",

   userTwoId: "22",
   userTwoName: "User TwoName",

   lastMessage: {
       senderName: "User Two Name",
       message: "rrrr"
   }
}

Я хочу найти документ, для которого userOneId равен someId или userTwoId равно «someId»

условия:

, если «userOneId» равен «someId»

 if userOneName is equal to lastMessage.senderName is true
       update both lastMessage.senderName and userOneName to "newUserName"

 if userOneName is equal to lastMessage.senderName is false
       update only userOneName to "newUserName"

или

, если «userTwoId» равен «someId»

 if userTwoName is equal to lastMessage.senderName is true
       update both lastMessage.senderName and userTwoName to "newUserName"

 if userTwoName is equal to lastMessage.senderName is false
       update only userTwoName to "newUserName"

, невозможно, чтобы оба условия выполнялись.

my Пример запроса: (до сих пор не знаю, как условно обновить свойство c)

conversationModel.updateMany(
          {
               $or: [
                        { userOneId: currentUserId },
                        { userTwoId: currentUserId },
               ]
           },

           {
               /*
                   insert conditionally update a specific property here
               */
           }
)

1 Ответ

1 голос
/ 04 февраля 2020

Полагаю, это то, что вы ищете (если вы хотите продолжить с 1 запросом):

db.getCollection('conversations').update({
    $or: [
        { userOneId: currentUserId },
        { userTwoId: currentUserId },
    ]
}, [{
    $set: {
        "lastMessage.sender": { $cond: [{ $or: [{ $eq: ["$userOneName", "$lastMessage.sender"] }, { $eq: ["$userTwoName", "$lastMessage.sender"] }] }, "newUserName", "$lastMessage.sender"] },
        "userOneName": { $cond: [{ $eq: ["$userOneId", currentUserId ] }, "newUserName", "$userOneName"] },
        "userTwoName": { $cond: [{ $eq: ["$userTwoId", currentUserId ] }, "newUserName", "$userTwoName"] }
    }
}], { multi: true });

Объяснение :

  • Мы используйте метод .update, так как он поддерживает конвейер агрегации в качестве второго (обновления) параметра;
  • В соответствии с правилами обновления в вашем вопросе оператор $set содержит некоторые правила для обновления 3 поля:

    lastMessage.sender, если его значение равно либо userOneName, либо userTwoName, тогда значением для обновления является "newUserName", в противном случае используется старое значение;

    userOneName, когда значение userOneId равно значению currentUserId, тогда значение для обновления равно "newUserName", в противном случае используется старое значение;

    userTwoName, когда значение userTwoId равно значению currentUserId, тогда значением для обновления является «newUserName», в противном случае используется старое значение; операторы

  • $cond содержат правила следующей структуры : [ выражение , valueIfTrue , valueIfFalse ];

  • multi: true предусмотрена опция для обновления нескольких документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...