2017-07-26 67 views
0

我有一個簡單的註冊/登錄應用程序,它基本上是一個coursera/udemy類型,其中應用程序列出特定課程,用戶可以喜歡它們或註冊它們。我一直在嘗試使用mongodb函數來更新數據庫中的用戶,並且因爲用戶可以喜歡所需的課程來更新所有課程(課程有一個「usersLiked」字段,它是一個數組並且保留所有具有喜歡它)。通過更改數組中的對象更新MongoDB中的多個文檔

課程結構如下:

{ 
    "_id" : ObjectId("5977662564aac9f6c8d48884"), 
    "title" : "Title", 
    "lecturer" : "Lecturer", 
    "length" : 30, 
    "coverPhoto" : "Photo", 
    "usersLiked": [ 
     { 
      "_id" : ObjectId("597763e346a7a463cbb8f529"), 
      "fullname" : "Name", 
      "username" : "Username", 
      "password" : "Hash", 
      "city" : "City", 
      "street" : "Street", 
      "website" : "Website" 
     } 
    ], 
    "lectures" : [ 
     { 
      "title" : "Introduction", 
      "number" : 1, 
      "url" : "someURL" 
     } 
    ] 
} 

而且用戶結構:

{ 
    "_id" : ObjectId("597763e346a7a463cbb8f529"), 
    "fullname" : "Name", 
    "username" : "Username", 
    "password" : "Hash", 
    "enrolledCourses" : [ 
     ... 
      ] 
     } 
    ], 
    "city" : "City", 
    "street" : "Street", 
    "website" : "Website" 
} 

所以現在當我想改變我調用這個函數。它改變了userCollection,但在courseCollection中它什麼都不做,而它應該獲得所有課程,並且如果其中一些在「usersLiked」數組中有一個帶有用戶名(用戶的用戶名)的對象,它也應該修改那裏的用戶。

const updateUser = (username, details) => { 
     usersCollection 
      .update({ 
       username: username, 
      }, { 
       $set: { 
        fullname: details.fullname, 
        city: details.city, 
        street: details.street, 
        website: details.website, 
       }, 
      }); 
     coursesCollection 
      .updateMany(
       { 
        usersLiked: { 
         $elemMatch: { 
          username: username, 
         }, 
        }, 
       }, 
       { 
        $set: { 
         'usersLiked.username': details.username, 
         'usersLiked.city': details.city, 
         'usersLiked.street': details.street, 
         'usersLiked.website': details.website, 
        }, 
       } 
      ); 
    }; 

回答

0

你在球場上的更新比賽看起來有效,但您要設置的值到一個數組,並根據需要提供一個數組索引或位置運營商Mongo docs

以下將允許set命令在usersLiked陣列內的第一個元素上操作,該元素與給定的username匹配。

coursesCollection.updateMany(
    { 
     usersLiked: { 
      $elemMatch: { 
       username: username, 
      }, 
     }, 
    }, 
    { 
     $set: { 
      'usersLiked.$.username': details.username, 
      'usersLiked.$.city': details.city, 
      'usersLiked.$.street': details.street, 
      'usersLiked.$.website': details.website 
     }, 
    } 
) 

您還可以選擇usersLiked陣列中的哪個元素進行更新,例如, usersLiked.1.username但我懷疑每個過程只有usersLiked中的一個元素對於給定的username,在這種情況下使用$運算符(意​​味着:第一個匹配的數組元素)就足夠了。

+0

但通過這樣做,我改變了所有喜歡該課程的用戶。而這仍然無法正常工作。 – nivalen292

+0

set操作僅適用於與$ elemMatch子句匹配的文檔中usersLiked數組中的第一個元素。 $ elemMatch關注於單個用戶,因此設置操作不會更改所有喜歡該課程的用戶。 – glytching

+0

我看到了,但仍然不會更改數據庫中的文檔。 – nivalen292

相關問題