Mongodb 带投影的Mongo查询
在mongo中,如果条件匹配,如何从列表中返回所有match dict元素 以下是我的数据: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" : "
{"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。有很多新事物和更好的性能。看见