【问题标题】:Check if all matching elements match the criteria检查所有匹配的元素是否符合条件
【发布时间】:2021-09-07 05:00:30
【问题描述】:

例如我们有下一个数据集:

balls = [
  {
    _id: 0,
    color: 'red',
    size: 10,
    available: true,
  },
  {
    _id: 1,
    color: 'red',
    size: 15,
    available: false,
  },
  {
    _id: 2,
    color: 'blue',
    size: 10,
    available: true,
  }
]

我想运行如下查询:

balls.every({ color: 'red' }, { available: true }); // should return false
balls.update({ color: 'red', available: false }, { available: true }); // set unavailable red ball to true
balls.every({ color: 'red' }, { available: true }); // should return true

在一种.every(query, condition) 类型中。如果query返回的文档全部匹配condition,则返回true,否则返回false

否则,我将不得不获取所有匹配的文档,然后手动检查它们是否都可用。我可以使用上述解决方案节省这些步骤,而且成本会更低。

【问题讨论】:

  • 是文档中的balls数组字段还是所有3个对象都是集合中的根文档?
  • balls 是一个集合/模型

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
  • 每个函数执行查找查询和检查所有可用的函数都是 true,
  • 或者使用聚合查询返回一个具有所有可用状态的文档
async function _every(query, condition) {
  let result = await balls.find(query, { _id: 0, available: 1 }).lean();
  return (
    result.length > 0 &&
    result.every(e => e.available === condition.available)
  );
}

// OR

async function _every(query, condition) {
  let result = await balls.aggregate([
    { $match: query },
    {
      $group: {
        _id: null,
        available: { $push: "$available" }
      }
    }
  ]);
  return (
    result.length > 0 &&
    result[0].available.every(e => e === condition.available)
  );
}
  • 更新函数以执行 updateMany 查询:
async function _update(query, condition) {
  await balls.updateMany(query, { $set: condition });
}

您可以像这样执行查询:

await _every({ color: 'red' }, { available: true }); 
await _update({ color: 'red', available: false }, { available: true }); 
await _every({ color: 'red' }, { available: true }); 

【讨论】:

  • 更新了问题,抱歉我不够清楚。您的解决方案不能解决问题。
  • 我已经更新了答案,您可以根据您的要求进行测试并告诉我它的工作原理。
猜你喜欢
  • 2019-08-22
  • 2012-05-26
  • 1970-01-01
  • 2013-03-06
  • 2014-06-28
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多