Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何修改mongodb/mongoose查询,使其采用对象数组而不是字符串数组?_Node.js_Mongodb_Mongoose - Fatal编程技术网

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;
}