Mongodb 返回聚合中的特定数组值字段

Mongodb 返回聚合中的特定数组值字段,mongodb,aggregation-framework,aggregate,Mongodb,Aggregation Framework,Aggregate,我在MongoDB中遇到了一个问题,我正在尝试构建一个非常复杂的聚合查询,它的工作几乎与我所希望的一样,但我仍然有问题,问题是我需要移动一个spefiect字段,以便以后使用它 我现在看起来像这样 db.getCollection('travel_sights').aggregate([{ '$match': { 'preview.photo' : { '$exists':true }, '_id': { '$in' : [ObjectId("

我在MongoDB中遇到了一个问题,我正在尝试构建一个非常复杂的聚合查询,它的工作几乎与我所希望的一样,但我仍然有问题,问题是我需要移动一个spefiect字段,以便以后使用它

我现在看起来像这样

db.getCollection('travel_sights').aggregate([{
  '$match': {
    'preview.photo' : {
      '$exists':true
    },
    '_id': {
      '$in' : [ObjectId("5b7af9701fbad410e10f32f7")]
    }
  }
},{
  '$unwind' : '$preview.photo'
}, {
  '$lookup':{
    'from' : 'media_data',
    'localField' : '_id',
    'foreignField':'bind',
    'as':'media'
  }   
}])
它将返回这样的数据

{
    "_id" : ObjectId("5b7af9701fbad410e10f32f7"),
    "preview" : {
        "photo" : {
            "id" : ObjectId("5b7affea1fbad441494a663b"),
            "sort" : 0
        }
    },
    "media" : [ 
        {
            "_id" : ObjectId("5b7affea1fbad441494a663b")
        }, 
        {
            "_id" : ObjectId("5b7b002d1fbad441494a663c")
        }, 
        {
            "_id" : ObjectId("5b7b00351fbad441494a663d")
        }, 
        {
            "_id" : ObjectId("5b7d9baa1fbad410de638bbb")
        }, 
        {
            "_id" : ObjectId("5b7d9bae1fbad410e10f32f9")
        }, 
        {
            "_id" : ObjectId("5b7d9bb11fbad441494a663e")
        }, 
        {
            "_id" : ObjectId("5b7d9bb41fbad4ff97273402")
        }, 
        {
            "_id" : ObjectId("5b7d9bb71fbad4ff99527e82")
        }, 
        {
            "_id" : ObjectId("5b7d9bbb1fbad410de638bbc")
        }, 
        {
            "_id" : ObjectId("5b7d9bbe1fbad410e10f32fa")
        }, 
        {
            "_id" : ObjectId("5b7d9bc11fbad441494a663f")
        }, 
        {
            "_id" : ObjectId("5b7d9bc41fbad4ff97273403")
        }, 
        {
            "_id" : ObjectId("5b7d9bc71fbad4ff99527e83")
        }, 
        {
            "_id" : ObjectId("5b7d9bca1fbad410de638bbd")
        }, 
        {
            "_id" : ObjectId("5b7d9bcd1fbad441494a6640")
        }, 
        {
            "_id" : ObjectId("5b7d9bd01fbad4ff97273404")
        }
    ]
}
{
    "_id" : ObjectId("5b7af9701fbad410e10f32f7"),
    "preview" : {
        "photo" : {
            "id" : ObjectId("5b7b002d1fbad441494a663c"),
            "sort" : 0
        }
    },
    "media" : [ 
        {
            "_id" : ObjectId("5b7affea1fbad441494a663b")
        }, 
        {
            "_id" : ObjectId("5b7b002d1fbad441494a663c")
        }, 
        {
            "_id" : ObjectId("5b7b00351fbad441494a663d")
        }, 
        {
            "_id" : ObjectId("5b7d9baa1fbad410de638bbb")
        }, 
        {
            "_id" : ObjectId("5b7d9bae1fbad410e10f32f9")
        }, 
        {
            "_id" : ObjectId("5b7d9bb11fbad441494a663e")
        }, 
        {
            "_id" : ObjectId("5b7d9bb41fbad4ff97273402")
        }, 
        {
            "_id" : ObjectId("5b7d9bb71fbad4ff99527e82")
        }, 
        {
            "_id" : ObjectId("5b7d9bbb1fbad410de638bbc")
        }, 
        {
            "_id" : ObjectId("5b7d9bbe1fbad410e10f32fa")
        }, 
        {
            "_id" : ObjectId("5b7d9bc11fbad441494a663f")
        }, 
        {
            "_id" : ObjectId("5b7d9bc41fbad4ff97273403")
        }, 
        {
            "_id" : ObjectId("5b7d9bc71fbad4ff99527e83")
        }, 
        {
            "_id" : ObjectId("5b7d9bca1fbad410de638bbd")
        }, 
        {
            "_id" : ObjectId("5b7d9bcd1fbad441494a6640")
        }, 
        {
            "_id" : ObjectId("5b7d9bd01fbad4ff97273404")
        }
    ]
}
{
    "_id" : ObjectId("5b7af9701fbad410e10f32f7"),
    "preview" : {
        "photo" : {
            "id" : ObjectId("5b7b00351fbad441494a663d"),
            "sort" : 0,
            "primary" : false
        }
    },
    "media" : [ 
        {
            "_id" : ObjectId("5b7affea1fbad441494a663b")
        }, 
        {
            "_id" : ObjectId("5b7b002d1fbad441494a663c")
        }, 
        {
            "_id" : ObjectId("5b7b00351fbad441494a663d")
        }, 
        {
            "_id" : ObjectId("5b7d9baa1fbad410de638bbb")
        }, 
        {
            "_id" : ObjectId("5b7d9bae1fbad410e10f32f9")
        }, 
        {
            "_id" : ObjectId("5b7d9bb11fbad441494a663e")
        }, 
        {
            "_id" : ObjectId("5b7d9bb41fbad4ff97273402")
        }, 
        {
            "_id" : ObjectId("5b7d9bb71fbad4ff99527e82")
        }, 
        {
            "_id" : ObjectId("5b7d9bbb1fbad410de638bbc")
        }, 
        {
            "_id" : ObjectId("5b7d9bbe1fbad410e10f32fa")
        }, 
        {
            "_id" : ObjectId("5b7d9bc11fbad441494a663f")
        }, 
        {
            "_id" : ObjectId("5b7d9bc41fbad4ff97273403")
        }, 
        {
            "_id" : ObjectId("5b7d9bc71fbad4ff99527e83")
        }, 
        {
            "_id" : ObjectId("5b7d9bca1fbad410de638bbd")
        }, 
        {
            "_id" : ObjectId("5b7d9bcd1fbad441494a6640")
        }, 
        {
            "_id" : ObjectId("5b7d9bd01fbad4ff97273404")
        }
    ]
}
您可以使用的是最后一个数据上的
preview.photo.primary
,以及完成聚合查询后要返回的字段

我的最终查询如下所示:

db.getCollection('travel_sights').aggregate([{
  '$match': {
    'preview.photo' : {
      '$exists':true
    },
    '_id': {
      '$in' : [ObjectId("5b7af9701fbad410e10f32f7")]
    }
  }
},{
  '$unwind' : '$preview.photo'
}, {
  '$lookup':{
    'from' : 'media_data',
    'localField' : '_id',
    'foreignField':'bind',
    'as':'media'
  }   
},{
  '$unwind':'$media'
},{
  '$project' : {
    'preview' : 1,
    'media': 1,
  }
}, {
  '$group': {
    '_id':'$media._id',
    'primary': {
      '$first':'$preview'
    }
  }   
}])
这里的问题是当我想要
$preview
返回时,我可以找到关于它的主要内容,它总是只返回第一个不存在值的地方,如果我使用
$push
问题是我得到了所有东西

有没有办法让我在报税表中选择正确的主值?尝试使用
$addFields
,但没有任何类型的锁

旅游景点数据:

{
    "_id" : ObjectId("5b7af9701fbad410e10f32f7"),
    "city_id" : ObjectId("5b6d0cb6222d4c70b803eaeb"),
    "activated" : true,
    "deleted" : false,
    "url" : "url is here",
    "name" : "title of it here",
    "updated_at" : ISODate("2018-08-22T17:22:27.000Z"),
    "content" : "content here",
    "preview" : {
        "photo" : [ 
            {
                "id" : ObjectId("5b7affea1fbad441494a663b"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7b002d1fbad441494a663c"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7b00351fbad441494a663d"),
                "sort" : 0,
                "primary" : true
            }, 
            {
                "id" : ObjectId("5b7d9baa1fbad410de638bbb"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bae1fbad410e10f32f9"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bb11fbad441494a663e"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bb41fbad4ff97273402"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bb71fbad4ff99527e82"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bbb1fbad410de638bbc"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bbe1fbad410e10f32fa"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bc11fbad441494a663f"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bc41fbad4ff97273403"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bc71fbad4ff99527e83"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bca1fbad410de638bbd"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bcd1fbad441494a6640"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bd01fbad4ff97273404"),
                "sort" : 0
            }
        ]
    }
}
{
    "_id" : ObjectId("5b7affea1fbad441494a663b"),
    "file-name" : "55575110311__0F115282-B5A0-4654-AA44-B7DC2C682992.jpeg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ]
}
{
    "_id" : ObjectId("5b7b002d1fbad441494a663c"),
    "file-name" : "55575110748__E7B07EFD-9F7E-40D6-8B57-38F708E4C0C0.jpeg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ],
    "description" : "this is secoudn demo!",
    "title" : "demo 3"
}
{
    "_id" : ObjectId("5b7b00351fbad441494a663d"),
    "file-name" : "paris2.jpg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ],
    "description" : "this is a demo1 :)",
    "title" : "demo"
}
3在此处绑定数据的示例:

{
    "_id" : ObjectId("5b7af9701fbad410e10f32f7"),
    "city_id" : ObjectId("5b6d0cb6222d4c70b803eaeb"),
    "activated" : true,
    "deleted" : false,
    "url" : "url is here",
    "name" : "title of it here",
    "updated_at" : ISODate("2018-08-22T17:22:27.000Z"),
    "content" : "content here",
    "preview" : {
        "photo" : [ 
            {
                "id" : ObjectId("5b7affea1fbad441494a663b"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7b002d1fbad441494a663c"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7b00351fbad441494a663d"),
                "sort" : 0,
                "primary" : true
            }, 
            {
                "id" : ObjectId("5b7d9baa1fbad410de638bbb"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bae1fbad410e10f32f9"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bb11fbad441494a663e"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bb41fbad4ff97273402"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bb71fbad4ff99527e82"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bbb1fbad410de638bbc"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bbe1fbad410e10f32fa"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bc11fbad441494a663f"),
                "sort" : 0
            }, 
            {
                "id" : ObjectId("5b7d9bc41fbad4ff97273403"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bc71fbad4ff99527e83"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bca1fbad410de638bbd"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bcd1fbad441494a6640"),
                "sort" : 0,
                "primary" : false
            }, 
            {
                "id" : ObjectId("5b7d9bd01fbad4ff97273404"),
                "sort" : 0
            }
        ]
    }
}
{
    "_id" : ObjectId("5b7affea1fbad441494a663b"),
    "file-name" : "55575110311__0F115282-B5A0-4654-AA44-B7DC2C682992.jpeg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ]
}
{
    "_id" : ObjectId("5b7b002d1fbad441494a663c"),
    "file-name" : "55575110748__E7B07EFD-9F7E-40D6-8B57-38F708E4C0C0.jpeg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ],
    "description" : "this is secoudn demo!",
    "title" : "demo 3"
}
{
    "_id" : ObjectId("5b7b00351fbad441494a663d"),
    "file-name" : "paris2.jpg",
    "options" : [ 
        ObjectId("5b6fb855222d4c70b8041093")
    ],
    "type" : "images",
    "files" : [ 
        {
            "width" : 70,
            "height" : 53
        }, 
        {
            "width" : 400,
            "height" : 300
        }, 
        {
            "width" : 800,
            "height" : 600
        }, 
        {
            "width" : 1600,
            "height" : 1200
        }
    ],
    "bind" : [ 
        ObjectId("5b7af9701fbad410e10f32f7")
    ],
    "description" : "this is a demo1 :)",
    "title" : "demo"
}

您可以使用聚合从存在
字段的数组中筛选出元素,然后使用
媒体轻松筛选出元素。\u id
字段并获取文档值

最后,您的查询将是

db.getCollection("travel_sights").aggregate([
  { "$match": {
    "preview.photo" : { "$exists":true },
    "_id": { "$in" : [ ObjectId("5b7af9701fbad410e10f32f7") ] }
  }},
  { "$addFields": {
    "preview.photo": {
      "$arrayElemAt": [
        { "$filter": {
          "input": "$preview.photo",
          "as": "photo",
          "cond": { "$ne": [ "$$photo.primary", undefined ] }
        }}, 0
      ]
    }
  }},
  { "$lookup":{
    "from" : "media_data",
    "localField" : "_id",
    "foreignField": "bind",
    "as": "media"
  }},
  { "$unwind":"$media" },
  { "$project" : { "preview" : 1, "media": 1, }},
  { "$group": {
    "_id": "$media._id",
    "primary": { "$first": "$preview" }
  }}  
])

为什么在第一次查询的第二阶段使用
$unwind
进行
预览
?我这样做是因为我需要排序,我的绑定选项中的主要值(preview.photo.$.sort和preview.photo.$.primary)我不知道以后如何获得它。从这里开始,您的尝试或实现似乎很困难。。。如果您发布您的初始样本集合和所需的输出,这会更好。而不是
$unwind
$preview.photo
将此添加到第二阶段
{$addFields:{“preview.photo”:{$arrayElemAt:[{$filter:{input:$preview.photo],如:“photo”,条件:{$ne:[“$$photo.primary”,未定义]}},0]}}}
非常好,以前从未见过,你能用awsner解释一下吗?:)它的wirdt,我仍然返回false,我认为它返回resalt,但是我错了,我已经添加了主数据+3个绑定示例,如果它有帮助的话。那么你想得到
$preview.photo.primary
等于true的结果吗?我希望每个照片的当前值$preview.photo.primary都是true,false或not existsHow不知道
$preview.photo.primary的当前值。。。有什么标准吗?请同时发布您的示例输出i'm$unwind before将所有$preview.photo拆分,然后我执行$lookup将$preview.photo.id与$media合并。\u id此处我获得了我的数据,并将其分组,最后只获得一次,当我$unwind时,我可以使用id,对每个$preview.photo进行排序和主控,但当我以后对其进行分组时,它就消失了,无法再次访问它。