Node.js MongoDB获取至少有一个非空数组的文档
我的模式:Node.js MongoDB获取至少有一个非空数组的文档,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的模式: db.Interactives=mongoose.model( "互动",, 新模式({ url:String, 形式:数组,, 输入:数组, 文本区域:数组, }) ); 我想查找至少有一个数组不为空的所有文档,因此我尝试: wait db.Interactives.find({ $elemMatch:{ 表格:{$ne:[]}, 输入:{$ne:[]}, text区域:{$ne:[]}, }, }) .选择('-\u id-\u v') .exec() 如何实现这一点?您的代
db.Interactives=mongoose.model(
"互动",,
新模式({
url:String,
形式:数组,,
输入:数组,
文本区域:数组,
})
);
我想查找至少有一个数组不为空的所有文档,因此我尝试:
wait db.Interactives.find({
$elemMatch:{
表格:{$ne:[]},
输入:{$ne:[]},
text区域:{$ne:[]},
},
})
.选择('-\u id-\u v')
.exec()
如何实现这一点?您的代码的问题是,它正在尝试确保没有数组是空的。另一个问题是
$elemMatch
在数组元素中搜索值。如果不想这样做,您需要将数组与空白数组进行比较。您需要做的唯一更改是将$elemMatch
替换为$或
,并添加类似的括号
await db.Interactives.find({
$or: [
{forms: { $ne: [] }},
{inputs: { $ne: [] }},
{textarea: { $ne: [] }},
]
})
.select('-_id -__v')
.exec()
您在查询中遗漏了
$或。
也可以通过多种方式实现。
假设这是您的数据集
[
{"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: []}}
]
})
db.collection.find({
$or: [
{language: {$gt: []}},
{ degree: {$gt: []}}
]
})
如果数组中的字段是可选字段,请像上面的查询一样使用$exists
备选方案二
db.collection.find({
$or: [
{language: {$ne: []}},
{degree: {$ne: []}}
]
})
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": []
}
]
所以,你可以用任何方式来做