我有一个基于以下架构的(简化)模型:
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
数组中的所有值。
答案 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可用的语法更好一点。