如何检查列表中的值是否不为空并排除空列表情况?

时间:2019-02-12 23:26:18

标签: mongodb

我有这个模型:

{
  "personId": 1,
  "name": "jack",
  "aliasses": [
    {
      "aliasName": "rob"
    },
    {
      "aliasName": "mark"
    }
  ]
}

我想查询所有name =空字符串(“”)和aliasName第一个孩子!= ""的文档,所以我这样写:

db.people.find({name: "", "aliasses.aliasName": {$ne: ""}}).count()

问题是,如果我有一个只有两个文档的集合,并且其中一个在aliasses中有空列表,像这样:

{
    "personId" : 3,
    "name" : "",
    "aliasses" : [
        {
            "aliasName" : "rob"
        },
        {
            "aliasName" : "mark"
        }
    ]
}
{
    "personId" : 4,
    "name" : "",
    "aliasses" : [ ]
}

然后在上面运行查询,我将得到2,而不是1 ...

我只想查找name为空字符串“”并且aliasName!= ""的情况(仅当别名大于1时)

2 个答案:

答案 0 :(得分:1)

如果要检查非空数组,可以使用$ne

db.people.find({ "name": "", "aliasses": { "$ne": [] }}).count()

如果您要检查别名中的第一个元素

db.collection.find({
  "name": "",
  "$expr": {
    "$and": [
      { "$ne": [{ "$arrayElemAt": ["$aliasses.aliasName", 0] }, ""] },
      { "$ne": [{ "$arrayElemAt": ["$aliasses.aliasName", 0] }, undefined] },
    ]
  }
})

答案 1 :(得分:0)

找到解决方案:

db.people.find({name: "", $where: "this.aliasses.length >= 1" ,"aliasses.aliasName": {$ne: ""}})