Mongodb find() 只包含非空数组
Posted
技术标签:
【中文标题】Mongodb find() 只包含非空数组【英文标题】:Mongodb find() only include non-empty arrays 【发布时间】:2014-09-07 17:23:45 【问题描述】:我试图通过查找查询实现的是,如果它的内部数组不为空,则只包含“someArray”。例如下面的 JSON:
"document": "some document",
"someArray": [
"innerArray": [
"not empty"
]
,
"innerArray": [
[] //empty
]
]
会返回这个:
"document": "some document",
"someArray": [
"innerArray": [
"not empty"
]
]
我正在使用以下查找:
Visit.find('someArray.innerArray.0': $exists: true, function(err, data));
但是,这会返回所有数据。
也试过了:
Visit.find(, 'someArray.innerArray': $gt: 0, function(err, data) );
但这没有任何回报
关于如何解决这个问题的任何想法?
干杯
【问题讨论】:
【参考方案1】:这里检查非空数组的一般情况是检查“第一个”元素是否确实存在。对于单个匹配项,您可以使用 positional $
运算符进行投影:
Vist.find(
"someArray.innerArray.0": "$exists": true ,
"document": 1,"someArray.$": 1,
function(err,data)
);
如果您需要多个匹配项或数组嵌套比这更深,那么aggregation framework 是您处理更难的投影和/或“过滤”多个匹配项的数组结果所需要的:
Visit.aggregate(
[
// Match documents that "contain" the match
"$match":
"someArray.innerArray.0": "$exists": true
,
// Unwind the array documents
"$unwind": "$someArray" ,
// Match the array documents
"$match":
"someArray.innerArray.0": "$exists": true
,
// Group back to form
"$group":
"_id": "$_id",
"document": "$first": "$document" ,
"someArray": "$push": "$someArray"
],function(err,data)
)
在这里值得注意的是,您将其称为“空”,但实际上并非如此,因为它实际上包含另一个空数组。您可能不想对真实数据执行此操作,但如果您有,则需要像这样进行过滤:
Visit.aggregate(
[
"$match":
"someArray": "$elemMatch": "innerArray.0": "$ne": []
,
"$unwind": "$someArray" ,
"$match":
"someArray.innerArray.0": "$ne": []
,
"$group":
"_id": "$_id",
"document": "$first": "$document" ,
"someArray": "$push": "$someArray"
],function(err,data)
);
【讨论】:
以上是关于Mongodb find() 只包含非空数组的主要内容,如果未能解决你的问题,请参考以下文章
给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)