Mongodb Mongo聚合和过滤器
我正在尝试使用以下查询筛选文档:Mongodb Mongo聚合和过滤器,mongodb,aggregation,Mongodb,Aggregation,我正在尝试使用以下查询筛选文档: db.projects.aggregate([ { $project: { deployments: { $filter: { input: "$releases.deployments", as: "deployment", cond: { $eq: [
db.projects.aggregate([
{
$project: {
deployments: {
$filter: {
input: "$releases.deployments",
as: "deployment",
cond: { $eq: ["$$deployment.environment", "Live"] }
}
}
}
}
])
deployments
的输出总是一个空数组,尽管如果我将条件更改为$ne
,它将返回所有结果
如何使筛选条件仅返回deployment.environment
等于字符串Live
的记录
下面是一个json示例:
{
"project_id": "1",
"project_group": "A",
"releases": [
{
"version": "1",
"deployments": [
{
"environment": "Integration",
"created": "2019-10-01T06:40:01.000Z",
"state": "Success",
"name": "Deploy to Integration"
},
{
"environment": "Test",
"created": "2019-10-01T08:23:58.000Z",
"state": "Success",
"name": "Deploy to Test"
},
{
"environment": "Live",
"created": "2019-10-01T09:02:17.000Z",
"state": "Success",
"name": "Deploy to Live"
}
]
}
]
}
如果
发行版
是一个嵌入文档,但它是一个嵌入文档数组,那么您的查询将非常有效。
下面的查询将迭代发布
的每个元素,并筛选环境为实时
的部署
db.collection.aggregate([
{
$project:{
"releases":{
$map:{
"input":"$releases",
"as":"release",
"in":{
$mergeObjects:[
"$$release",
{
"deployments":{
$filter:{
"input":"$$release.deployments",
"as":"deployment",
"cond":{
$eq:["$$deployment.environment","Live"]
}
}
}
}
]
}
}
}
}
},
{
$project:{
"releases":{
$filter:{
"input":"$releases",
"as":"release",
"cond":{
$ne:["$$release.deployments.0",null]
}
}
}
}
}
]).pretty()
输出:
{
"_id" : ObjectId("5d93401ef2e6411a68a145ee"),
"releases" : [
{
"version" : "1",
"deployments" : [
{
"environment" : "Live",
"created" : "2019-10-01T09:02:17.000Z",
"state" : "Success",
"name" : "Deploy to Live"
}
]
}
]
}
尝试下面的聚合:
db.projects.aggregate([
{
$unwind: "$releases"
},
{
$project: {
version: "$releases.version",
deployments: {
$filter: {
input: "$releases.deployments",
as: "deployment",
cond: {
$eq: [
"$$deployment.environment",
"Live"
]
}
}
}
}
},
{
$group: {
_id: "$_id",
releases: {
$push: {
deployments: "$deployments",
version: "$version"
}
}
}
}
])
在项目开始前先释放,然后在项目结束后再分组。你能给我举个例子吗?@Neil How it’s duplicate of?@Mr.s.Sharma这是一个非常清晰的副本。“过滤嵌入式阵列”正是这个问题所要问的。OP应该阅读它,以了解它实际上是如何完成的,并考虑到所有条件。你甚至可以自己在那里学到一些东西。这很管用,但它也包括很多空记录,例如:{“部署”:[],“版本”:“1.0.66.63”}如何将这些记录排除在结果集中?我们只需要在空部署上添加一个过滤器。让我更新查询。更新查询。谢谢,我仍然有空记录,但我比10分钟前的位置提前了100英里,当时我正在检查同一份文档,并试图找出我没有结果的原因!