Nodejs mongoose find 返回的对象数组怎么单独取出一个键值对?

Nodejs mongoose find 返回的对象数组怎么单独取出一个键值对?

var messages = db.model(‘messages’, mongoose.Schema({}), ‘messages’); messages.find({},{PROGRAM:1,_id:0}).limit(10).exec(function(err, obj) { console.log(obj); //这里可以输出 for(var i=0; i<obj.length; i++) { console.log(obj[i].PROGRAM); //为什么这里输出undefined } });


4 回复

Node.js Mongoose find 返回的对象数组如何单独取出一个键值对?

当你使用 Mongoose 的 find 方法查询数据库时,返回的结果是一个对象数组。在这个数组中,每个对象都包含你查询的字段数据。如果你希望从这些对象中单独取出某个特定的键值对(例如 PROGRAM),你可以通过遍历数组并访问相应的键来实现。

在你的例子中,你已经接近正确的方法了,但是可能有一些小问题需要修正。让我们来看一下正确的实现方式:

const mongoose = require('mongoose');
const db = mongoose.connection;

// 假设你已经连接到 MongoDB 数据库
db.on('open', () => {
    const messages = db.collection('messages'); // 使用原始的 MongoDB collection

    messages.find({}, { PROGRAM: 1, _id: 0 }).limit(10).toArray((err, docs) => {
        if (err) {
            console.error(err);
            return;
        }

        // 遍历返回的文档数组
        for (let doc of docs) {
            console.log(doc.PROGRAM); // 输出 PROGRAM 字段的值
        }
    });
});

解释

  1. 模型定义

    • 通常情况下,我们会定义一个 Mongoose 模型来操作数据库。但是在你的例子中,你直接使用了 db.collection 来获取集合,这在某些情况下是可以接受的,但通常我们推荐使用 Mongoose 模型。
  2. 查询和限制结果

    • find({}, { PROGRAM: 1, _id: 0 }) 这行代码表示查询所有文档,并只返回 PROGRAM 字段,不返回 _id 字段。
    • .limit(10) 表示只返回前 10 条记录。
  3. 处理结果

    • toArray 方法用于将游标结果转换为数组,然后我们可以遍历这个数组。
    • 在遍历过程中,我们可以通过 doc.PROGRAM 访问每个文档中的 PROGRAM 字段。

注意事项

  • 确保你已经正确连接到 MongoDB 数据库。
  • 如果你使用的是 Mongoose 模型,确保模型定义正确,并且已经加载了 schema。
  • 如果你在遍历结果时遇到 undefined,检查是否确实有 PROGRAM 字段存在,并且确保查询条件正确。

这样,你应该能够成功地从 Mongoose 查询结果中提取出 PROGRAM 字段的值。


findOne

明白你意思了,不需要循环,直接 console.log(obj.PROGRAM);

在使用 Mongoose 进行查询时,如果你只想获取特定字段(如 PROGRAM 字段),可以在查询时通过投影(projection)来实现。你在查询中已经通过 {PROGRAM:1,_id:0} 来指定只返回 PROGRAM 字段。但是,在回调函数中,你需要确保正确访问对象的属性。

示例代码

const mongoose = require('mongoose');

// 假设你已经有数据库连接和模型定义
const messages = mongoose.model('messages', new mongoose.Schema({}, { strict: false }));

messages.find({},{PROGRAM:1,_id:0}).limit(10).exec((err, obj) => {
    if (err) {
        console.error("Error:", err);
        return;
    }

    // 确保 obj 是一个数组
    if (Array.isArray(obj)) {
        for (let i = 0; i < obj.length; i++) {
            // 输出每个文档中的 PROGRAM 字段
            console.log(obj[i].PROGRAM);
        }
    } else {
        console.log("Expected an array but got something else.");
    }
});

解释

  1. 模型定义:使用 new mongoose.Schema({}, { strict: false }) 定义一个不严格的模式,这样即使文档中包含未定义的字段也不会报错。

  2. 查询:使用 find() 方法进行查询,并通过投影 {PROGRAM:1,_id:0} 来限制返回的字段。注意,_id:0 表示不返回默认的 _id 字段。

  3. 回调函数:在回调函数中,首先检查是否有错误。然后检查 obj 是否为数组。如果是数组,遍历数组并打印每个对象的 PROGRAM 字段。

  4. 输出:如果 obj[i] 中确实存在 PROGRAM 字段,它应该被正确地打印出来。

注意事项

  • 如果 obj[i].PROGRAM 仍然显示为 undefined,请确保 MongoDB 中实际存储的数据包含 PROGRAM 字段。你可以通过 MongoDB 的命令行工具或 GUI 工具来验证这一点。

  • 如果你仍然遇到问题,请检查你的数据库连接和模型定义是否正确。

回到顶部