gpt4 book ai didi

javascript - Mongodb find() 只包含非空数组

转载 作者:可可西里 更新时间:2023-11-01 09:57:05 25 4
gpt4 key购买 nike

我试图通过查找查询实现的是仅在其内部数组不为空时包含“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) {});

但这没有任何返回

关于如何解决这个问题有什么想法吗?

干杯

最佳答案

检查非空数组的一般情况是检查“第一个”元素是否确实存在。对于单场比赛,您可以使用 positional $ 投影运算符(operator):

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) {


}
);

关于javascript - Mongodb find() 只包含非空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24793376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com