在mongodb对象点表示法中使用变量

时间:2018-08-21 10:33:38

标签: node.js mongodb

如果对象的属性值确实存在于数组中,我想增加它。

Mongo记录:

{
    "_id" : ObjectId("5b7bdd9f0465e8345ba83aad"),
    "userID" : "400",
    "userName" : "Jon Snow",
    "pageName" : "1",
    "courseName" : "Maths",
    "socketID" : [
        "aswKWYyE1euk2GNIAAAD"
    ],
    "online" : true,
    "userHistory" : {
        "pagesVisited" : [
            {
                "page" : "1",
                "timesVisited" : 1
            }
        ],
        "coursesVisited" : [
            "Maths"
        ]
    },
    "date" : ISODate("2018-08-21T09:38:39.281Z")
}

如果我再次获得值 1 ,则在userHistory.pagesVisited属性的page上,那么我想像这样增加timesVisited属性:

"pagesVisited" : [
    {
       "page" : "1",
       "timesVisited" : 2
    }
],

这是我没有运气尝试过的东西:

let userDetails = {
   userID: queryUser.userID,
   userName: queryUser.username,
   pageName: queryUser.pageName,
   courseName: queryUser.courseName,
   socketID: [socket.id],
   online: true,
   userHistory: {
     pagesVisited: [
        {
          "page" : queryUser.pageName,
          "timesVisited" : 1
        }
     ],
     coursesVisited: [queryUser.courseName]
   },
   date: new Date()
};

onlineUsersDB.findOne({'userID': userDetails.userID}).then(async (user) => {
     if (user) {
         let page = {"page": queryUser.pageName, "timesVisited": 1};
         let course = queryUser.courseName;
         let updatedUser = await onlineUsersDB.findOneAndUpdate(
           {'userID': user.userID}, 
           {
             $set: {'online': true}, 
             $push: { 'socketID': socket.id },
           },
           { $addToSet: { 'userHistory.coursesVisited': course } },
           { returnOriginal: false }
         );
         let updatedUserPageRef = updatedUser.value.userHistory.pagesVisited;
         if (updatedUserPageRef) {
           let pageFound = await updatedUserPageRef.findIndex(item => item.page === page);
           if (pageFound >= 0) {
            let updatedUserPage = await onlineUsersDB.findOneAndUpdate(
              {'userID': updatedUser.value.userID},
             // Here I want to reference the variable pageFound
              {$inc: { 'userHistory.pagesVisited.[pageFound].timesVisited': 1 }},
              { returnOriginal: false }
            );
            console.log(JSON.stringify(updatedUserPage,null, 2));
           }
         }
         let users = await onlineUsersDB.find({'online': true}).toArray();
         io.to(room).emit('online-users', users);
         io.to(room).emit('user-back-online', updatedUser);
     } else {
         if (userDetails.userID !== '100') {
            await onlineUsersDB.insert(userDetails);
         }
         let users = await onlineUsersDB.find({'online': true}).toArray();
         io.to(room).emit('online-users', users);
     }
}).catch((e) => console.log(e));

在上面的代码中,我要在注释中使用对象点表示法引用变量pageFound,如下所示:

{$inc: { 'userHistory.pagesVisited.[pageFound].timesVisited': 1 }}

当我给它一个硬编码的值时,它就可以工作:

{$inc: { 'userHistory.pagesVisited.0.timesVisited': 1 }}

1 个答案:

答案 0 :(得分:0)

经过一些试验后,我使它像这样工作:

我使用模板文字将查询字符串分解为另一个变量。

let pageInc = `userHistory.pagesVisited.${pageFound}.timesVisited`;

然后像下面这样在我的查询中引用该变量:

{$inc: { [pageInc]: 1 }}

它现在可以工作。