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

在Mongoose/MongoDB中筛选子文档中的数组、数组和文档中的数组

宗建章
2023-03-14

b)“Units”字段包含带有“period”字段的子文档(日期对象数组),其中给定的日期位于数组中的第一和第二元素之间。

数据结构如下所示:

{
  "_id" : ObjectId("5984bdfdb3ac279e39f156d4"),
  "surname" : "Dare",
  "firstname" : "Dan",
  "units" : [{
               "period" : [
                            ISODate("2018-01-01T00:00:00.000Z"), 
                            ISODate("2019-12-31T00:00:00.000Z")
                          ],
               "unit" : {
                          "unit_name" : "My test unit",
                           "_id" : "5979437c6d346eb7d074497a"
                        }
            }]
}

我尝试使用.find()和.aggregate()的各种组合,例如在periol数组上使用$project和$filter,在unit._id上使用$elemmatch之后使用$elemmatch,但是没有用--我得到了诸如“不能在数组上使用$filter”之类的错误。

{
    surname: {
    type: String
  },
    firstname: {
    type: String
  },
  units: {
    type: [{
      unit: {
        _id: String,
        unit_name: String,
      },
      period: [Date]
    }]
  }
}

共有1个答案

方嘉言
2023-03-14

我觉得我把问题搞得太复杂了。我不确定这是否是最有效的方法,但使用$and操作符似乎提供了我想要的:

db.getCollection("records").find({ "$and": [
{"units.unit._id": "5979437c6d346eb7d074497a"},
{"units.unit_period.0": {"$gte": new Date('2018-12-31T00:00:00.000Z')} },
{"units.unit_period.1": {"$lte": new Date('2020-12-31T00:00:00.000Z')} } ]
})

根据Neil Lunn在评论中的建议,使用$elemmatch而不是$,当然是更好的选择,因为给出的原因。

因此,这是我将采用的解决方案;也就是说,使用#ElemMatch来匹配那些包含嵌入子文档和数组的元素,在这些元素中,值可以通过键上的简单点符号进行访问和匹配。

db.getCollection("records").find({ "units": 
  { "$elemMatch": 
    { "unit._id": "5979437c6d346eb7d074497a", 
      "unit_period.0": { "$gte": new Date("2019-12-31") },
      "unit_period.1": { "$lte": new Date("2020-12-31") }
    } 
  })
 类似资料:
  • 我有一份这样的文件 上面的文档可以这样概括如下,便于理解。 我需要增加nums子文档中数量的值,该值位于产品子文档中,基于其\u id。 这是我迄今为止所尝试的,但它不起作用,因为我不知道如何捕获nums对象内的\u id,以便更新子子文档数组中的特定对象。 我怎样才能做到这一点?

  • 问题内容: 我正在尝试使用Spring查询Mongo存储库并过滤数组子文档。我已经参考过如何使用mongodb过滤子文档中的数组,但是想知道是否有更合适的方法或Java结构化方法来使用Spring。 我当前正在使用速记存储库接口符号,但是我正在获取未过滤数组的完整文档。 PersonRepository.java 人.java 地址.java 样本输入 预期产量 实际产量 问题答案: 好吧,在Sp

  • 我是新来的mongo。我有以下收藏。 文件: 请求: 文档集合中的typeId是文档类型的id,其中请求中的typeId是也可以为空的外部字段。如何获得以下输出。

  • 问题内容: 以下架构仅用于记录特定日期的总观看次数和观看次数。 因此,今天的视图将存储在不同于昨天的另一个子文档中。为了实现这一点,我尝试使用upsert,以便在查看产品的每一天都会创建子文档,并且计数将基于特定的一天进行递增和记录。我尝试使用以下功能,但似乎无法按我预期的方式工作。 我想得到我想要的功能会错过什么?任何帮助将不胜感激。 问题答案: 实际上,您在这里尝试做的事情需要您了解一些可能尚

  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 我有一系列这样的Mongoid 这些是我收藏的文件的mongo-id。 现在,通过获取这些mongoIDs的数组,即['mongoID1','mongoID2','mongoID3'],我需要通过使用其_id来查询这些id指定的每个文档,并在我的代码逻辑中独立处理其数据。为了简单起见,我刚刚“打印”了输出ieres.json(doc.name)。 如果Mongoose/MongoDB中确实存在这样