MongoDB获取具有至少一个非空数组的文档

时间:2019-07-31 15:36:32

标签: node.js mongodb mongoose

我的模式:

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

我该如何实现?

2 个答案:

答案 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": []
  }
]

因此,您可以通过任何方式进行操作。