当前位置: 首页 > 知识库问答 >
问题:

查询具有基于子文档的条件的文档

呼延德华
2023-03-14

我有一个如下的房间模式:

let roomSchema = new mongoose.Schema({
  events: [{type: mongoose.Schema.ObjectId, ref: 'Event'}],
  name: { type: String, required: true, index: { unique: true } }
});

它包含一个事件ID数组。事件架构:

let eventSchema = new mongoose.Schema({
  title: { type: String, required: true },
  room: { type: mongoose.Schema.ObjectId, ref: 'Room', required: true },
  date: { type: Date, required: true },
  slot: { type: Number, required: true }
});

我试过这样的东西:

this.model.find(req.query).populate({
  path: 'events',
  match: {
    date: { $ne: req.query.date },
    slot: { $ne: req.query.slot }
  }
}).exec((err, rooms) => {

  rooms = rooms.filter((room) => {
    return room.events != null;
  });
  
  res.status(200).json(rooms);
});

但它当然不起作用(房间总是空数组)。我真的很难弄清楚。

如何查询具有基于子文档(事件)的条件的文档(房间)?

this.model.find(req.query).populate({
  path: 'events',
  match: {
    $and: [
      { date: { $eq: date } },
      { slot: { $eq: slot } }
    ]
  }
}).exec((err, reservedRooms) => {
  reservedRooms = reservedRooms.filter(room => room.events.length > 0);
  res.status(200).json(reservedRooms);
});

共有1个答案

浦德义
2023-03-14

填充为事件数组中的每个事件应用匹配条件。

因此,当对事件数组的每个元素应用否定时,当您获得填充数组时,存在可用事件(匹配)的数组与没有可用事件(不匹配)的数组之间的区别就消失了。

因此,必须使用server$lookup对整个数组应用条件。

this.model.aggregate([
  {
    "$match":{"events":{"$exist":true}}
  },
  {
    "$lookup": {
      "from": "events", // Collection name not model or schema name
      "localField": "events",
      "foreignField": "_id",
      "as": "events"
    }
  },
  {
    "$match":{"$not":{"$elemMatch":{"date": date, "slot":slot}}}
  }
]).exec((err, reservedRooms) => {});

这将输出带有事件的房间。您可以使用带有排除的$project从最终输出中删除事件。添加{$project:{“events”:0}}作为最后阶段。

 类似资料:
  • 我试图编写一个μn XSLT(1.0版)转换器,将输入的xml文件转换成另一种格式,运行一些用xml文件编写的xpath查询。Xpath查询根据从inptu文件中检索的系统和类型变量而变化。我做到了: 计算系统和类型后,我能够检索我的查询 xpath,如下所示: 如果我打印,一切看起来都不错: 当我尝试将$metadata_mapping作为xpath查询计算时: 我得到以下错误: 17:19:4

  • 我想只从我的两个对象数组和中得到那些符合标准的子文档。即使我已经找到了这个stackoverflow答案#2(根据标准查找猫鼬子文档),它对我来说并不像期望的那样工作,或者我错过了一些东西。 我的文档如下所示: 它将在和中打印项目及其所有子文档。但是,我只想获取与给定上载id匹配的子文档。我做错了什么? 编辑:这个问题是指用猫鼬来解决它。我不能在Mongoose中使用这个问题的集合语句(只检索Mo

  • 我有一个MongoDB存储来自不同传感器的数据。它具有以下结构: 例如,现在我需要“heart rate”-文档的所有字段和“data”-子文档的所有字段都符合条件“时间戳在1483537204000和1483537214000之间”。

  • 问题内容: 我有一个MongoDB,用于存储来自不同传感器的数据。它具有以下结构: 现在,例如,我需要“心率”-包含所有字段和“数据”字段的文档-匹配条件“ 1483537204000和1483537214000之间的时间戳记”的子文档。 我已经在另一个问题中的mongo shell中获得了有关如何执行此操作的答案。参见以下代码: 但是如何在java spring-data中做到这一点?似乎在sp

  • 我有一个表“Quote”,映射在hibernate中,它有一个由整数id和日期组成的复合键,还有几个附加列。我想编写一个条件查询,它使用DetachedCriteria来获取每个id中日期最长的行。 在sql中,我可能会编写一个查询,比如 在hibernate中,我认为可以像这样为“group by”子查询创建DetachedCriteria(其中Quote是映射表的类,“Qid”是键的复合id类

  • 问题内容: 我刚刚陷入这个问题。我有两种猫鼬模式: 问题是,如何从每个父文档中获取所有子文档(在这种情况下为对象)?假设我有一些数据: 我想通过一个查询来检索所有18岁以上的孩子。每个答案将不胜感激,谢谢! 问题答案: 您可以在最新的MongoDB版本中用作查询投影运算符。从mongo shell: 这会从数组中过滤掉较小的儿童文档: 如您所见,子代仍在其父文档中分组。MongoDB查询返回集合中