这是我的数据结构。
[{
"name": "David",
"lastname": "",
},
{
"name": "Angela"
}]
“lastname”有时会出现,有时不会出现,有时会出现“”。
我希望获得姓氏不等于“”的所有行。但这不起作用。当lastname为“”并且lastname完全不存在时,它返回两行。在上面的示例中,我想只获取David节点。
db.collection.find( {"lastname": {"$ne": ""}} )
答案 0 :(得分:74)
db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})
在mongo shell中(id省略了节省空间)
> db.collection.find()
{ "name" : "Angela" }
{ "name" : "David", "lastname" : "" }
{ "name" : "Kyle", "lastname" : "Test" }
{ "name" : "John", "lastname" : null }
> db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})
{ "name" : "Kyle", "lastname" : "Test" }
{ "name" : "John", "lastname" : null }
如果您还要根据空值过滤掉匹配项,则需要按如下方式调整条件(我们也可以将$ exists除去为“$ ne”:null处理此问题)
> db.collection.find({$and:[{"lastname": {"$ne": null}}, {"lastname": {"$ne": ""}}]})
{ "name" : "Kyle", "lastname" : "Test" }
答案 1 :(得分:1)
您可以使用正则表达式查询:
db.test.find({ "lastname": /(.|\s)*\S(.|\s)*/ })
此正则表达式匹配以0或N空格(.|\s)
开头或结尾的字符串,并且它必须是中间的一个或多个非空格\S
。
答案 2 :(得分:0)
在另一个解决方案中,我想到了这个问题:
db.collection.find({"lastname": {"$gte": " "}})
使用此方法,我只能得到非空字符串,也将忽略null和不存在的字段,因为任何可打印的值(ASCII)的值都大于空格(32)。
答案 3 :(得分:0)
我不确定这是否有帮助,但它对我有用。正则表达式 .+
返回包含超过 1 个字符的任何内容,而 .*
返回 0 或更多。所以它不会返回少于 0 个字符的任何内容。
就仅包含空格的字符串而言,我认为此解决方案无法处理。