Mongodb 带投影的Mongo查询

Mongodb 带投影的Mongo查询,mongodb,mongodb-query,pymongo,Mongodb,Mongodb Query,Pymongo,在mongo中,如果条件匹配,如何从列表中返回所有match dict元素 以下是我的数据: {"packages": [ {"package_name" : "abc", "installed_date" : "2016-08-03"}, {"package_name" : "def", "installed_date" : "2016-08-04"}, {"package_name" : "ghi", "installed_date" : "

在mongo中,如果条件匹配,如何从列表中返回所有match dict元素

以下是我的数据:

    {"packages": [
       {"package_name" : "abc", "installed_date" : "2016-08-03"},
       {"package_name" : "def", "installed_date" : "2016-08-04"},
       {"package_name" : "ghi", "installed_date" : "2016-08-03"},
       ]
    }
我应该如何查询以获取所有与
{“安装日期”:“2016-08-03”}

我试过:

db.resource.find({packages:{“$elemMatch”:{installed_date:“2016-08-03”}}})

但这给了我所有的数组元素。我想得到匹配
{installed_date:“2016-08-03”}

谢谢

尝试mongo聚合:

db.resource.aggregate([
  {'$match':{'packages.installed_date':'2016-08-03'}}, 
  {'$unwind':'$packages'}, 
  {'$match':{'packages.installed_date':'2016-08-03'}}, 
  {'$group':{'_id':'$_id', 'packages':{'$push':'$packages'}}}
])

尝试以下查询:它将适用于mongodb 3.2

db.resource.aggregate([
    {$match:{"packages.installed_date" : "2016-08-03"}},
    { $project: {
        package: {$filter: {
            input: '$packages',
            as: 'package',
            cond: {$eq: ['$$package.installed_date', "2016-08-03"]}
        }}
    }}
])

对于没有使用<强> 操作符的解决方案,如果没有使用多个匹配条件,则取消“

>p>”,考虑使用<强> < /> >边>强> <强>,在这里你可以“过滤”数组内容。

这更有效,因为它在单个管道中运行,并且生成文档的笛卡尔乘积,即每个数组条目的每个文档的副本,这会使用更多内存(聚合管道上的内存上限可能为总内存的10%)因此,在展平过程中生成和处理文档需要时间:

db.resource.aggregate([
    {
        "$project": {
            "packages": {
                "$setDifference": [
                    {
                        "$map": {
                            "input": "$packages",
                            "as": "item",
                            "in": {
                                "$cond": [
                                    { "$eq": [ "$$item.installed_date", "2016-08-03" ] },
                                    "$$item",
                                    false
                                ]
                            }
                        }
                    },
                    [false]
                ]
            }
        }
    }
])
在上面的管道中,操作符本质上创建了一个新的数组字段,该字段保存数组中每个元素的子表达式中的求值逻辑的结果值


然后,运算符返回一个集合,其中的元素出现在第一个集合中,但不出现在第二个集合中;i、 e.执行第二组相对于第一组的相对补码。在这种情况下,它将返回最终的
数组,该数组包含的元素具有
已安装的_date=“2016-08-03”

当您添加一个空白对象作为第一个参数时会发生什么:db.resource.find({},{packages:{$elemMatch:{installed_date 2016-08-03”}})看起来不起作用,它会返回所有其他没有该日期的软件包。谢谢,我会在升级到3.2great时尝试,如果可能的话,然后升级到3.2。有很多新事物和更好的性能。看见