Node.js 如何修改mongodb/mongoose查询,使其采用对象数组而不是字符串数组?
在我的应用程序中,我有一个注释模式:Node.js 如何修改mongodb/mongoose查询,使其采用对象数组而不是字符串数组?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,在我的应用程序中,我有一个注释模式: var CommentsSchema = new Schema({ user_id: {type: String, required: true, ref: 'users'}, text_content: {type: String}, is_anonymous: {type: Boolean, default: false} }); 现在,我正在构建一个mongoose查询来下载所有评论并将其显示给用户 由于我不想从被最终用户阻止
var CommentsSchema = new Schema({
user_id: {type: String, required: true, ref: 'users'},
text_content: {type: String},
is_anonymous: {type: Boolean, default: false}
});
现在,我正在构建一个mongoose
查询来下载所有评论并将其显示给用户
由于我不想从被最终用户阻止的用户那里下载帖子,我引入了一种排除被阻止作者的帖子的可能性:
var blockedUsers=req.body.blockedUsers
function withBlockedUsers(query, blockedUsers) {
if(blockedUsers != undefined){
query.$and.push({ 'user_id' : { $nin: blockedUsers } });
}
return query;
}
var query = {};
query.$and = [];
query = withBlockedUsers(query, blockedUsers)
...
query = Comment.find(query);
query.exec(function(err, comments){
if(err) {
callback(err);
return;
}
return callback(null, comments);
});
这段代码是有效的,当我调用我的端点时,我需要向那里发送一个string
被阻止的用户ID数组,它们的帖子将被排除
现在,我正在更改我的功能,而不是传递string
array of blocked users,而是传递array of objects:
{
user_id: '586af425378c19fc044aa85f'
is_anonymous: '0'
},
当这两个条件都满足时,我不想从这些用户那里下载帖子
例如,当我的应用程序中有两篇帖子时:
{
user_id: '586af425378c19fc044aa85f',
text_content: 'text1',
is_anonymous: true
},
{
user_id: '586af425378c19fc044aa85f', //same as above
text_content: 'text2',
is_anonymous: false
}
然后我传递blockedUsers
对象:
{
user_id: '586af425378c19fc044aa85f'
is_anonymous: '0'
},
作为回报,我只需要显示:
{
user_id: '586af425378c19fc044aa85f',
text_content: 'text1',
is_anonymous: true
},
另一篇文章应该被阻止,因为用户id
被识别,并且是匿名的
是假的
使用我当前的代码,我遇到了错误:
消息:“路径处的值“[object]”转换为字符串失败
“用户id”,名称:'CastError',种类:'string',值:{
用户id:'586af425378c19fc044aa85f',
is_anonymous:'0'},路径:'user_id',原因:路径“user_id”处的值“[object object]”转换为字符串失败
您需要一种方法来构造一个使用运算符的查询,该运算符对一个或多个查询表达式的数组执行逻辑“或”运算,并返回数组中所有查询表达式都失败的文档 例如,当您传递一组对象时,如
var blockedUsers = [
{
user_id: '586af425378c19fc044aa85f'
is_anonymous: '0'
},
{
user_id: '585808969e39db5196444c06'
is_anonymous: '0'
},
{
user_id: '585808969e39db5196444c07'
is_anonymous: '0'
}
]
您的查询基本上应该以
Comment.find({
"$nor": [
{
user_id: '586af425378c19fc044aa85f'
is_anonymous: false
},
{
user_id: '585808969e39db5196444c06'
is_anonymous: false
},
{
user_id: '585808969e39db5196444c07'
is_anonymous: false
}
]
}).exec(function(err, comments){
if(err) {
callback(err);
return;
}
return callback(null, comments);
});
因此,任务是转换如下内容
var blockedUsers = [
{
user_id: '586af425378c19fc044aa85f'
is_anonymous: '0'
},
{
user_id: '585808969e39db5196444c06'
is_anonymous: '0'
},
{
user_id: '585808969e39db5196444c07'
is_anonymous: '0'
}
]
到
由于传递的是一个对象数组,因此可以使用方法将is\u anonymous
值强制转换为布尔值,因此重构后的函数应该如下所示:
function withBlockedUsers(query, blockedUsers) {
var norOperator = [];
if(blockedUsers != undefined){
norOperator = blockedUsers.map(function(user){
return {
"user_id": user.user_id,
"is_anonymous": (user.is_anonymous === '1')
}
});
query["$nor"] = norOperator;
}
return query;
}
@谢谢你的解释!我这里还有一个问题-我看到您正在比较
user.is_anonymous===“1”
,但在我的情况下,我可以发送带有true
或false
的标志。我的意思是,用户{“user:'1234',“is_anonymous”:true}
应被视为与{“user:'1234',“is_anonymous”:false}
不同的用户。我想你的代码目前只检查标志是否等于true
,对吗?不,你在问题中说现在我正在更改功能,而不是传递阻止用户的字符串数组,而是传递对象数组:{user\u id:'586af425378c19fc044aa85f'是匿名的:'0'},
is_anonymous标志是一个字符串,部分user.is_anonymous=='1'
将其转换为布尔值。现在你说你可以发送带有true
或false
(不是字符串)的标志,你能相应地更新你的问题吗(相当混乱)?此外,如果您以布尔值形式发送数据,则可以将部分“is_匿名”:(user.is_匿名=='1')
更改为仅“is_匿名”:user.is_匿名)
,并且查询应该可以工作。代码不会仅检查is_anonymous
字段,而是检查用户id
和is_anonymous
字段,因为在表达式中指定逗号分隔的值时,会隐式声明和
逻辑,无需包含$和
运算符。
function withBlockedUsers(query, blockedUsers) {
var norOperator = [];
if(blockedUsers != undefined){
norOperator = blockedUsers.map(function(user){
return {
"user_id": user.user_id,
"is_anonymous": (user.is_anonymous === '1')
}
});
query["$nor"] = norOperator;
}
return query;
}