我怎么能修改我的mongodb / mongoose查询,以便它需要对象的数组而不是数组的string?

在我的应用程序中,我有一个评论架构:

var CommentsSchema = new Schema({ user_id: {type: String, required: true, ref: 'users'}, text_content: {type: String}, is_anonymous: {type: Boolean, default: false} }); 

现在我正在构build一个mongoose查询来下载所有评论并将其显示给用户。

由于我不想从最终用户阻止的用户下载post,所以我引入了排除阻止作者的post的可能性:

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

该代码的作品,当我呼叫我的端点时,我需要发送一个阻塞的用户ID string数组,他们的post将被排除在外。

现在我正在改变我的function,而不是传递被阻止的用户string数组我传递的对象数组:

 { user_id: '586af425378c19fc044aa85f' is_anonymous: '0' }, 

当这两个条件都满足时,我不想从这些用户那里下载post。

所以例如,当我在我的应用程序中有两个职位:

 { 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 }, 

另一个post应该被阻止,因为user_id被识别, is_anonymousfalse

用我目前的代码,我得到错误:

消息:在path“user_id”',名称:'CastError',种类:'string',值:{user_id:'586af425378c19fc044aa85f',is_anonymous:'0'}上强制转换为string值“[object Object]path:'user_id',原因:未定义}在path“user_id”的值为“[object Object]”时,

您需要一种方法来构造一个查询,该查询使用$nor操作符对一个或多个查询expression式的数组执行逻辑NOR操作,并且返回数组中所有查询expression式都失败的文档。

例如,当你传递一个对象数组

 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' } ] 

 var query = { "$nor": [ { user_id: '586af425378c19fc044aa85f' is_anonymous: false }, { user_id: '585808969e39db5196444c06' is_anonymous: false }, { user_id: '585808969e39db5196444c07' is_anonymous: false } ] } 

由于您传递的是对象数组,因此可以使用map()方法将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; }