使用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] 删除。
我来说两句