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

JuJ*_*oDi 4 mongoose mongodb node.js

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

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

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

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

Mongoose 是否为此提供了 API,或者是否有一个查询参数可以传递给 Model#find 来获取此功能?我只希望当文档的 bar 属性包含数组中的所有值时返回该文档barsToFind

Nei*_*unn 5

有多种方法可以构建您的查询来执行此操作,这些方法根据您的 mongodb 服务器版本而有所不同。因此,从您的代码开始:

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

model.find({
    "bars": { "$all": barsToFind }
},
Run Code Online (Sandbox Code Playgroud)

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

var andBars = [];

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

model.find({
    "$and": andBars
},
Run Code Online (Sandbox Code Playgroud)

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