Mongoose - 查找其数组属性包含给定子集的所有文档?

时间:2014-04-19 21:12:38

标签: node.js mongodb mongoose

我有一个基于以下架构的(简化)模型:

schema = mongoose.Schema({
    foo: { type: String },
    bars: [{ type: String }]
});
model = mongoose.model ('model', schema);

我想创建一个API来返回包含逗号分隔列表中提供的所有“栏”的所有文档。所以我有:

exports.findByBars = function (req, res) {
  var barsToFind = req.body.bars.split(',');
  // find the matching document
};

Mongoose是否为此提供了API,或者是否有可以传递给Model#find的查询参数来获取此功能?我只想要一个文档,如果它的bar属性包含barsToFind数组中的所有值。

1 个答案:

答案 0 :(得分:3)

有多种方法可以构建您的查询来执行此操作,根据您的mongodb服务器版本,方法会有所不同。所以继续你的代码:

对于MongoDB 2.6及更高版本,请使用$all运算符:

model.find({
    "bars": { "$all": barsToFind }
},

尽管运算符确实存在于以前的版本中,但它的行为却不同,因此您实际上需要生成$and语句以显式匹配每个条目:

var andBars = [];

barsToFind.forEach(function(bar) {
    andBars.push({ "bars": bar })
});

model.find({
    "$and": andBars
},

两者都确保您只匹配包含数组中所有条目的文档,这只是MongoDB 2.6可用的语法更好一点。