You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:07:14