gpt4 book ai didi

node.js - 在 mongodb 对象点表示法中使用变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:34 26 4
gpt4 key购买 nike

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

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")
}

page 属性的 userHistory.pagesVisited 上,如果我再次获得值 1,那么我想增加 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 }}

最佳答案

经过一番尝试后,我让它像这样工作:

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

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

然后在我的查询中引用变量,如下所示:

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

现在可以使用了。

关于node.js - 在 mongodb 对象点表示法中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com