在Mongoose / MongoDB中的子文档,数组,文档中过滤数组

业余土豚

使用Mongoose(或什至只是MongoDB查询),我想返回与所有文档都匹配的查询的结果,其中两个都:

a)“单位”字段(子文档数组)包含一个带有“单位”字段的子文档,该子文档本身包含一个带有“ _id”字段且与给定字符串值相匹配的子文档,

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

数据结构如下所示:

{
  "_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()的各种组合,例如在unit._id上的$ elemMatch之后,在句点数组上使用$ project和$ filter,但无济于事-我遇到了诸如“不能在数组上使用$ filter”。

至少在最合适的查询类型和组合运算符以生成我想要的数据集的最有效方式方面,任何朝着正确方向的指针都将受到赞赏。

模式(按要求):

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

认为我使问题复杂化了。不确定这是否是最有效的方法,但是使用$ 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匹配包含嵌入式子文档和数组的元素,这些元素可以通过键上的简单点符号来访问和匹配值。

我试图使用$ filter和$ aggregate对解决方案进行过度编码感到很内was,而在检索数据集时,我实际上是如此简单:

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") }
    } 
  })

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

mongodb / mongoose findMany-查找ID在数组中列出的所有文档

如何在mongoose / mongodb中的文档中获取对象数组中的对象?

使用Mongoose更新数组中的子文档

如何使用Mongodb / Mongoose中的子文档处理深度更新?

查找文档,然后使用Node.JS Mongoose将值插入MongoDB中的数组

更新子文档中的数组-mongoose mongodb

更新/拉取Mongodb / Mongoose中子文档数组中包含的数组中的值

对查询结果基于Mongoose / Mongodb数组中嵌套子文档的desc值进行排序

通过ID查找文档并在Mongoose中过滤子数组

在mongoose中的子文档mongodb中将对象添加到数组中。找不到属性“消息”

从Mongoose中的文档中检索数组元素

在Mongoose中更新子文档数组而不获取父对象

如果Mongoose数组中包含元素,则查找Mongodb文档

如何使用Mongoose将值推入MongoDB中嵌入式文档中的数组?

无法将子文档推送到Mongoose中的文档数组

如何在 mongoose/mongodb 中对子文档数组进行排序?

在 Mongoose 中过滤子文档数组并仅返回匹配的元素

Mongoose:过滤文档并操作嵌套数组

Mongoose 更新嵌套文档数组中嵌套对象中的值

在mongoose中查询子文档的子文档

Mongoose ADDING/SUMING 子文档数组值位于另一个子文档数组中

Mongoose 获取多个文档数组中的所有元素

mongoose - 查询子文档中的数组值

如何使用 mongoose 在 mongodb 中过滤数组?

Mongoose:如何将子文档中的数组提取到父文档中的单个数组

在 ID 数组中包含 ID 的 Mongoose 查询文档

如何使用 Mongoose 查询过滤到在数组类型字段中具有指定值的文档?

Mongoose / MongoDB - 在另一个文档中按数组查询

如何使用 mongoose 在单个 mongodb 文档中更新数组中的多个对象