如何修改我的mongodb查询,以便结果不包含存储在数组中的特定值?

时间:2016-11-22 13:06:05

标签: node.js mongodb mongoose mongoose-schema

我正在使用mongoose并在我的应用中为评论部分定义了一个模型:

var mongoose    = require('mongoose');
var Schema      = mongoose.Schema;

var CommentSchema = new Schema({
    my_username: {type: String, required: true},
    text_content: {type: String},
    hashtags: {type: [String]},
    photo_content: {type: String},
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

现在,当我下载属于特定时间范围的所有评论并包含主题标签时,我有:

var hashtagsInput = req.body.hashtags;
var query= {};

query.$and = [];

if(startDate != undefined && endDate != undefined) {
    var startDate = new Date(req.param('startDate'));
    var endDate = new Date(req.param('endDate'));
    query.$and.push({"created_at":{$gte: startDate}});
    query.$and.push({"created_at":{$lte: endDate}});
}

if (hashtagsInput != undefined) {
    var hashtags = hashtagsInput.split(",");
    query.$and.push({"hashtags":{$in: hashtags}});
}

现在我正在尝试向查询添加另一个案例 - 除了一组主题标签我正在传递被阻止用户数组:

var blockedUsers = req.body.blockedUsers;

我想避免每个评论都与authorUsers中的任何条目相同。所以基本上我想要not in查询。你能给我一些如何在我的查询中构建这个附加条件的提示吗?

1 个答案:

答案 0 :(得分:3)

看起来这应该可以解决问题:

if (blockedUsers) {
  query.$and.push({"my_username": {$not: {$in: blockedUsers}}});
}

或者,甚至更好:

if (blockedUsers) {
  query.$and.push({"my_username": {$nin: blockedUsers}});
}

或者您可能需要像使用标签一样在逗号上拆分它 - 您没有指定如何传递被阻止的用户:

var blockedUsers = req.body.blockedUsers;
if (blockedUsers) {
  var blocked = blockedUsers.split(',');
  query.$and.push({"my_username": {$nin: blocked}});
}

请参阅:https://docs.mongodb.com/manual/reference/operator/query/nin/