Node.js项目中用Mongoose编写Mongo查询:筛选特定库存条件的文档
Mongoose查询:同时满足仓库A库存>10且存在仓库B的文档
需求说明
需要筛选出同时符合以下两个条件的文档:
instock数组中存在warehouse为'A'且qty大于10的库存项instock数组中存在**warehouse为'B'**的库存项(不限制该仓库的qty值)
数据示例(修正笔误后)
原数据中第四个文档的in stock应为instock,修正后的数据如下:
[ { item: 'journal', instock: [ { warehouse: 'A', qty: 5 }, { warehouse: 'C', qty: 15 } ] }, { item: 'planner', instock: [ { warehouse: 'A', qty: 1 }, { warehouse: 'B', qty: 5 } ] }, { item: 'planner', instock: [ { warehouse: 'A', qty: 40 }, { warehouse: 'B', qty: 5 } ] }, { item: 'postcard', instock: [ { warehouse: 'A', qty: 15 }, { warehouse: 'B', qty: 15 }, { warehouse: 'C', qty: 35 } ] } ]
Mongoose查询代码
推荐使用语义更清晰的$elemMatch写法,确保数组元素的条件匹配逻辑准确:
const result = await YourModel.find({ $and: [ { instock: { $elemMatch: { warehouse: 'A', qty: { $gt: 10 } } } }, { instock: { $elemMatch: { warehouse: 'B' } } } ] });
如果需求明确,也可以用简化写法(效果一致):
const result = await YourModel.find({ 'instock.warehouse': 'A', 'instock.qty': { $gt: 10 }, 'instock.warehouse': 'B' });
代码解释
$and:强制两个条件同时生效,确保文档必须满足所有筛选规则$elemMatch:指定数组中存在至少一个元素完全匹配给定的组合条件,避免跨元素误匹配(比如不会把"一个元素是A仓库、另一个元素qty>10"的情况误判为符合条件)
预期结果
[ { item: 'planner', instock: [ { warehouse: 'A', qty: 40 }, { warehouse: 'B', qty: 5 } ] }, { item: 'postcard', instock: [ { warehouse: 'A', qty: 15 }, { warehouse: 'B', qty: 15 }, { warehouse: 'C', qty: 35 } ] } ]
内容的提问来源于stack exchange,提问作者Srikanth Alva
相关产品推荐
相关产品推荐

