mongodb用变量更新数组
Posted
技术标签:
【中文标题】mongodb用变量更新数组【英文标题】:mongodb update an array with a variable 【发布时间】:2016-06-09 06:40:13 【问题描述】:我有一系列网站,可以对它们进行投票或反对。在集合中是一个空数组,通过将 userId 插入到数组中来跟踪已经投票的用户
问题:我可以插入用户 ID 甚至用户名,但它只将 id/name 变量存储为当时的字符串。如果我再次点击投票,前一个元素将变为整数。似乎只有当我在它们周围加上“”时,字符串才会保留。但我正在使用一个变量来获取用户 ID/名称。当我把“”放在它周围时,我真的得到“theVariable”,没有帮助。我已经尝试了所有我能想到的......感谢任何帮助。
架构
url:url,
title:title,
description:description,
createdOn:new Date(),
createdBy:Meteor.user()._id,
votes: 0,
upVotes: 0,
downVotes: 0,
voted: []
代码
"click .js-downvote":function(event)
// access the id for the website in the database
var website_id = this._id;
console.log("Down voting website with id "+website_id);
//add a down vote
var user = Meteor.user()._id;
if (user)
var theUser = this.voted.push(user);
Websites.update(_id:website_id, $inc: votes: 1, $inc:downVotes: -1 , $push:voted: theUser);
console.log(this.voted);
return false;// prevent the button from reloading the page
每次单击时我都会在控制台得到输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "mWe4r2JcfhRAvn97y"]
首先我得到了字符串,然后对于随后的每次单击,字符串都会向下移动,第一个元素变成一个数字。我每次都需要存储用户标识。所以我可以检查它是否允许投票。
【问题讨论】:
哪一行和哪一个内容将这个记录到控制台?此外,您不需要 三个.update()
语句,因为它们都应该在一个中,并且确实需要检查用户是否已经在 voted
数组中:.update( "_id": website_id, "voted": "$ne": Mereor.user()._id , "$inc": "votes": 1, "downvotes": -1 , "$push": "voted": Meteor.user()._id )
还要注意你不想“推动”一个“数组”,而只是这个项目。不确定您的想法是围绕保留另一个数组而不是更新的项目。有点困惑你的问题出在哪里。
我可能怀疑你的 "moves down" 实际上是我刚才提到的将数组插入数组的行为。
所以我包含了日志调用并将我的更新调用都放在了一个中。问题是当我把它合二为一时它不起作用。我把它们分开了,很好。
【参考方案1】:
解决方案:
似乎只有当我在它们周围加上“”时,字符串才会保留。但 我正在使用一个变量来获取用户 ID/名称。当我在它周围加上“” 我真的得到了“theVariable”,没有帮助。
如果您使用的是 ES6 或更高版本的 JS,则可以使用字符串插值。您必须使用反引号(`)而不是单引号(')。
例子:
var name = "Rose";
console.log(`"My name is $name"`);
输出:
"My name is Rose"
在你的代码中这样做:
Websites.update(_id:website_id, $push:voted: `"$theUser"`);
它被插值到:
Websites.update(_id:website_id, $push:voted: "userid within quotes");
您将获得包括在内的报价。使用此方法替换您的查询
【讨论】:
谢谢!我知道有些东西带有引号可以让它正常工作,但我不记得也找不到答案。以上是关于mongodb用变量更新数组的主要内容,如果未能解决你的问题,请参考以下文章
如何批量更新 MongoDB 字符串数组以用连字符替换空格?
mongodb更新查询删除命令中指定的字段以外的所有数组字段