Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MongoDB数组查询-选择一个数组元素_Arrays_Mongodb - Fatal编程技术网

Arrays MongoDB数组查询-选择一个数组元素

Arrays MongoDB数组查询-选择一个数组元素,arrays,mongodb,Arrays,Mongodb,我在查询包含数组的MongoDB集合时遇到问题。 这是我要查询的集合的结构。这是一个记录: { “_id”:“abc123def4567890”, “配置文件id”:“abc123def4567890”, “图像计数”:2, “图像”:[ { “图像id”:“ABC123456789”, “image_url”:“images/something.jpg”, “地理位置”:“-0.1234,11.234567890”, “头衔”:“头衔”, “拍摄时间”:“01:23:33”, “拍摄日期”:“

我在查询包含数组的MongoDB集合时遇到问题。
这是我要查询的集合的结构。这是一个记录:

{
“_id”:“abc123def4567890”,
“配置文件id”:“abc123def4567890”,
“图像计数”:2,
“图像”:[
{
“图像id”:“ABC123456789”,
“image_url”:“images/something.jpg”,
“地理位置”:“-0.1234,11.234567890”,
“头衔”:“头衔”,
“拍摄时间”:“01:23:33”,
“拍摄日期”:“2222年11月22日”,
“镜头类型”:“风景”,
“条件”:“多云”,
“iso”:16,
“f”:2.4,
“ss”:“1/545”,
“焦点”:6.0,
“设备”:“,
“指示”:“,
“上传日期”:1234567890,
“更新日期”:1234567890
},
{
“图像id”:“ABC123456789”,
“image_url”:“images/something.jpg”,
“地理位置”:“-0.1234,11.234567890”,
“头衔”:“头衔”,
“拍摄时间”:“01:23:33”,
“拍摄日期”:“2222年11月22日”,
“快照类型”:“肖像”,
“条件”:“多云”,
“iso”:“16”,
“f”:“2.4”,
“ss”:“1/545”,
“焦点”:“6.0”,
“设备”:“,
“指示”:“,
“上传日期”:1234567890,
“更新日期”:1234567890
}
]
}
请原谅格式问题,我不知道该如何显示

如您所见,它是一个配置文件,在一个名为“images”的数组中包含一系列图像,共有2个图像。每个“图像”数组项都包含图像的属性对象(url、标题、类型等)

我只想返回属性与特定条件匹配的object元素:

从已拍摄的图像中选择对象\u type=“布景”

我试图让它尽可能简单,因此我从以下几点开始:

find( { "images.shot_type": "scenery" } )
这将返回整个记录以及其中的两个图像。因此,我尝试了投影,但无法在数组中隔离单个对象(在本例中,对象位于位置0)并返回它

我认为答案在于投射,但我不确定

我已经查阅了MongoDB文档好几个小时了,找不到灵感。我读过关于$elemMatch、$和其他数组运算符的文章,似乎没有任何内容允许您根据其中的数据挑出数组项。我已经浏览了这一页了,但仍然无法理解

  • 有人能提供帮助吗
  • 我是否使用“$push”来填充我的图像字段(使其成为一个数组),而不是使用“$set”来填充嵌入的文档,从而犯了错误?这会有什么不同吗

  • 您可以这样使用
    $elemMatch
    (简化查询):

    db.collection.find({
    “配置文件id”:“1”,
    },
    {
    “图像”:{
    “$elemMatch”:{
    “放炮类型”:1
    }
    }
    })
    
    您可以将两个对象用于
    find
    查询。第一个将过滤所有文档,并仅获取
    profile\u id
    为1的文档。如果要搜索整个集合,可以省略此阶段并仅使用
    {}

    然后,另一个对象使用
    $elemMatch
    仅获取
    shot\u type
    为1的元素

    使用聚合检查示例

    db.collection.aggregate({
      $project: {
        _id: 0,
        "result": {
          $filter: {
            input: "$images",
            as: "img",
            cond: {
              $eq: [
                "$$img.shot_type",
                "scenery"
              ]
            }
          }
        }
      }
    })
    

    谢谢你。我需要更多地了解聚合。我想我可以用一个简单的“查找”来完成这个查询。我错了,不客气。mongo db提供免费课程。至少取一个@Phfog。需要1到2天的时间。学会使用
    $match
    $project
    $unwind
    几乎就足够了