2017-07-26 69 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

相关问题