我有这个模型:
{
"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时)
答案 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: ""}})