Nodejs mongoskin 查询,在find() 里面我想对数组的元素的dbref做一个db.dereference后,res.render()这个数组应该怎么做....请指教

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

Nodejs mongoskin 查询,在find() 里面我想对数组的元素的dbref做一个db.dereference后,res.render()这个数组应该怎么做…请指教

collection.findItems(query, option, function(err, array){ //这里应该怎么做 // var users = new Array(); // array.forEach(function(doc){ // db.dereference(doc.dbref_role, function(err, d){ // users.push(d); // }); // }); res.render(‘index’, {a:users}) });


5 回复

当然可以。在Node.js中使用mongoskin库查询数据库时,如果需要对数组中的元素进行dbref解引用,可以通过异步操作来处理,并最终将结果传递给res.render()方法。以下是一个具体的实现步骤和示例代码。

实现步骤

  1. 查询数据:首先使用find()方法从数据库中获取包含dbref的文档。
  2. 解引用dbref:对每个包含dbref的字段进行解引用,以获取实际的对象。
  3. 收集结果:将解引用后的结果收集到一个数组中。
  4. 渲染视图:最后,将收集到的结果传递给res.render()方法进行页面渲染。

示例代码

const express = require('express');
const MongoClient = require('mongoskin').MongoClient;

const app = express();

app.use(express.static(__dirname + '/public'));

app.get('/data', (req, res) => {
    const db = MongoClient.connect('mongodb://localhost:27017/yourdbname', { native_parser: true }).db('yourdbname');

    // 查询包含dbref的角色
    const query = {}; // 根据需要修改查询条件
    const options = {};

    db.collection('yourcollection').find(query, options).toArray((err, docs) => {
        if (err) {
            console.error(err);
            return res.status(500).send("Error fetching data");
        }

        const dereferencedUsers = [];

        // 对每个文档的dbref进行解引用
        docs.forEach(doc => {
            db.dereference(doc.dbref_role, (err, userDoc) => {
                if (err) {
                    console.error(err);
                    return res.status(500).send("Error dereferencing dbref");
                }
                dereferencedUsers.push(userDoc);

                // 当所有dbref都解引用完毕后,进行渲染
                if (dereferencedUsers.length === docs.length) {
                    res.render('index', { a: dereferencedUsers });
                }
            });
        });

        // 如果没有dbref,直接渲染
        if (docs.length === 0) {
            res.render('index', { a: [] });
        }
    });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

解释

  • db.dereference(): 这个方法用于解引用dbref,它接受一个dbref对象并返回实际的文档。
  • forEach(): 遍历查询结果中的每个文档,并对其中的dbref进行解引用。
  • if (dereferencedUsers.length === docs.length): 确保所有dbref都被正确解引用后,才调用res.render()方法。

这样就可以确保在res.render()之前,所有的dbref都已经成功解引用为实际的文档。


var _users = new Array();
collection.findItems(query,option,function(err,array){
    //遍历咯
    array.forEach(function(item){
        db.dereference(item.dbref_role,function(err,doc){
            _users.push(doc);
            if(_users.length == array.length){
                res.render('index',{a:_users});
            }
        });
    });
});

不知道是不是你要的答案, 我用的是mongoose,没用过mongoskin,但是异步嵌套的数据处理大都是这类似的处理。

非常感谢!!!!

应该加一个,要不好麻烦

在 Node.js 中使用 mongoskin 进行查询时,如果需要对数组中的每个元素执行 db.dereference 操作,你需要确保这些异步操作完成后再调用 res.render()。由于 db.dereference 是一个异步操作,你需要等待所有操作完成再渲染结果。

以下是一个示例代码,展示了如何处理这种情况:

const mongo = require('mongoskin');
const db = mongo.db('mongodb://localhost:27017/yourdb', { native_parser: true });

collection.find(query, options).toArray((err, docs) => {
  if (err) return res.status(500).send(err);

  let users = [];
  const promises = [];

  docs.forEach(doc => {
    const promise = db.dereference(doc.dbref_role, (err, user) => {
      if (err) throw err;
      users.push(user);
    });
    promises.push(promise);
  });

  // 等待所有异步操作完成
  Promise.all(promises).then(() => {
    res.render('index', { a: users });
  }).catch(err => {
    res.status(500).send(err);
  });
});

在这个示例中,我们创建了一个空数组 users 来存储去引用后的结果,并使用 Promise.all 等待所有 db.dereference 操作完成。这样可以确保所有数据准备好后再调用 res.render()

如果不需要返回具体的数组,只是需要将去引用后的结果传递给模板引擎,你可以直接使用 users 数组进行渲染。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!