我的模式:
db.Interactives = mongoose.model(
'Interactives',
new Schema({
url: String,
forms: Array,
inputs: Array,
textareas: Array,
})
);
我想找到所有至少有一个数组不为空的文档,所以我尝试了:
await db.Interactives.find({
$elemMatch: {
forms: { $ne: [] },
inputs: { $ne: [] },
textarea: { $ne: [] },
},
})
.select('-_id -__v')
.exec()
我该如何实现?
答案 0 :(得分:1)
您的代码存在的问题是它正在尝试确保没有数组为空。另一个问题是$elemMatch
在数组的元素中搜索值。您不想这样做,想将数组与空白数组进行比较。您唯一要做的更改是将$elemMatch
替换为$or
,并像这样添加方括号
await db.Interactives.find({
$or: [
{forms: { $ne: [] }},
{inputs: { $ne: [] }},
{textarea: { $ne: [] }},
]
})
.select('-_id -__v')
.exec()
答案 1 :(得分:1)
您错过的查询是$or
。
它也可以通过许多方式来完成。 假设这是您的数据集。
[
{"Id_Cust": "4145","firstName": "Albade","language": ["English,Nepali"],"degree": []},
{"Id_Cust": "5296","firstName": "Rafael","language": [],"degree": ["Bachelor,Masters"]},
{"Id_Cust": "6192","firstName": "Abdul","language": [],"degree": []}
]
现在,您可以这样做:
db.collection.find({
$or: [
{language: {$exists: true,$not: {$size: 0}}},
{degree: {$exists: true,$not: {$size: 0}}}
]
})
如果数组中的字段是可选字段,请使用$exists
,否则可以将其排除。
替代我
db.collection.find({
$or: [
{language: {$ne: []}},
{degree: {$ne: []}}
]
})
如果数组中的字段是可选字段,则像上面的查询一样使用$exists
。
替代II
db.collection.find({
$or: [
{language: {$gt: []}},
{ degree: {$gt: []}}
]
})
如果您数组中的字段是可选字段,则像在第一个查询中一样,使用$exists
。
所有方法都提供相同的输出:
[
{
"Id_Cust": "4145",
"_id": ObjectId("5a934e000102030405000000"),
"degree": [],
"firstName": "Albade",
"language": [
"English,Nepali"
]
},
{
"Id_Cust": "5296",
"_id": ObjectId("5a934e000102030405000001"),
"degree": [
"Bachelor,Masters"
],
"firstName": "Rafael",
"language": []
}
]
因此,您可以通过任何方式进行操作。