MongoDB:如何使用Cursor结合if语句查询空值publisher并输出信息?
解决MongoDB查询空publisher的问题
嘿,我来帮你搞定这个问题~你代码里的核心错误是误用了find()方法——x.book是文档里的字段(要么是子文档要么是数组),不是MongoDB的集合,所以不能调用find()来判断条件。下面分两种常见的文档结构给你正确的写法:
情况1:每个catalog文档包含单个book子文档
如果你的catalog集合中文档结构是这样的(每个文档对应一本书):
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "book": { "title": "MongoDB实战", "publisher": "", "publish_date": "2022-03-15" } }
写法一:客户端遍历判断
var mycursor = db.catalog.find({}); mycursor.forEach(function(x) { // 先确保book字段存在,再检查publisher为空字符串 if (x.book && x.book.publisher !== undefined && x.book.publisher === "") { print("Publisher is Empty, publishes book", x.book.title, "published at", x.book.publish_date); } });
写法二:查询阶段先过滤(更高效)
直接在find()里加条件,提前过滤出符合要求的文档,减少客户端处理的数据量:
var mycursor = db.catalog.find({ "book.publisher": { "$exists": true, "$eq": "" } }); mycursor.forEach(function(x) { print("Publisher is Empty, publishes book", x.book.title, "published at", x.book.publish_date); });
情况2:每个catalog文档包含book数组(多本书)
如果你的文档结构是一个catalog对应多本书,book是数组:
{ "_id": ObjectId("60d21b4667d0d8992e610c86"), "book": [ { "title": "MongoDB入门", "publisher": "", "publish_date": "2021-10-01" }, { "title": "NoSQL进阶", "publisher": "Packt", "publish_date": "2022-05-20" } ] }
正确写法
需要遍历book数组,逐个检查每本书的publisher:
var mycursor = db.catalog.find({}); mycursor.forEach(function(x) { // 先确认book是数组类型 if (Array.isArray(x.book)) { x.book.forEach(function(bookItem) { if (bookItem.publisher !== undefined && bookItem.publisher === "") { print("Publisher is Empty, publishes book", bookItem.title, "published at", bookItem.publish_date); } }); } });
同样,也可以先在查询阶段过滤出包含空publisher书籍的文档:
var mycursor = db.catalog.find({ "book.publisher": { "$exists": true, "$eq": "" } }); mycursor.forEach(function(x) { x.book.forEach(function(bookItem) { if (bookItem.publisher === "") { print("Publisher is Empty, publishes book", bookItem.title, "published at", bookItem.publish_date); } }); });
简单总结下:你之前的x.book.find()是集合专属的方法,不能用在文档字段上,直接检查字段值或者遍历数组就可以实现需求啦~
内容的提问来源于stack exchange,提问作者taboli birry
相关产品推荐
相关产品推荐

