我怎么能修改我的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_anonymous
为false
。
用我目前的代码,我得到错误:
消息:在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; }