我有一组看起来像这样的文件:
{
my_array : [
{
name : "...",
flag : 1 // optional
},
...
]
}
如何查询其中一个元素包含标志字段的文档?
这将返回my_array
长度恰好为1的文档:
db.col.find({ "my_array" : { $size : 1 } })
这将返回 my_array
对象的至少一个包含标记字段的文档:
db.col.find({ "my_array.flag" : { $exists : true } })
这将查找其中flag是大小为1的数组的文档:
db.col.find({ "my_array.flag" : { $size : 1 } })
我想以某种方式组合前两个查询,检查一些内部字段存在,然后查询已过滤数组的大小
答案 0 :(得分:1)
您可以尝试$redact
$filter
来查询。
$filter
与$ifNull
保持匹配元素后跟$size
和$redact
,并将结果与1进行比较以保留并删除文档。
db.col.aggregate(
[{
$match: {
"my_array.flag": {
$exists: true
}
}
}, {
$redact: {
$cond: {
if: {
$eq: [{
$size: {
$filter: {
input: "$my_array",
as: "array",
cond: {
$eq: [{
$ifNull: ["$$array.flag", null]
}, "$$array.flag"]
}
}
}
}, 1]
},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}]
)
答案 1 :(得分:0)
在mongodb中使用聚合框架,
管道阶段1:匹配,
checking for some inner field existence,
{ "my_array.flag" : { $exists : true } }
pipleline阶段2:项目,
querying for the size of the filtered array,
{$project:{ "my_array":{$size:"$my_array"}}}
mongoshell Command,
db.col.aggregate([{
$match: {
"my_array.flag": {
$exists: true
}
}
}, {
$project: {
"my_array": {
$size: "$my_array"
}
}
}])
答案 2 :(得分:0)
根据关于使用聚合的当前答案,以下是使用聚合的工作解决方案:
db.col.aggregate([
{ $match : { "my_array.flag" : { $exists : true } } },
{ $unwind : "$my_array" },
{ $match : { "my_array.flag" : { $exists : true } } },
{ $group : { _id : "$_id", count_flags : { $sum : 1 } } },
{ $match : { "count_flags" : 1 } }
])
以下是解释的步骤:
flag
字段的文档(这将使用我的索引来大幅减少我需要处理的文档数量)my_array
数组,以便能够将每个元素作为单独的文档处理flag
_id
分组,并计算元素(包含flag
字段)count_flags
字段我不太喜欢这个解决方案,在标准mongo
find
查询中获取基本支持的内容似乎有很多步骤。