Node Express Mongoose数组未使用引用的模型填充

时间:2018-01-26 07:54:35

标签: javascript node.js mongodb express mongoose

我一直在尝试在模型数组中添加相关模型。但是当我测试api时,数组总是空的。我一直在寻找Stackoverflow和谷歌的答案,但没有任何效果。

SCHEMAS&模型

// POST
router.post('/accounts', (req, res) => {
  user = new User({
    title: 'Ms',
    firstName: 'Paula',
    lastName: 'Testerson',
    username: '@paulatest',
    avatar: '',
    email: 'paula.test@emailtest.com',
    dob: '01 January 1989',
    password: 'test123',
    createdAt: Date.now()
  });

  account = new Account({
    createdAt: Date.now(),
    accountNumber: 7651234,
    balance: 91.75,
    daysLeft: 23,
    nextMonthPayment: 19.57,
    paymentType: 'debit card',
    currentPlan: {
      name: 'Fast Furious',
      usage: {
        used: 10356,
        left: 89644,
        total: 100000,
        meta: {
          trafficData: [{
            date: 'Fri Dec 22 2017 14:42:14 GMT+0000 (GMT)',
            amount: 100.50,
            download: 20.65,
            upload: 16.90
          }],
        }
      }
    },
    user: user._id
  });

  user.save((err) => {
    if (err) { res.send(err); }

    account.save(err => {
      if (err) { res.send(err); }
      res.json({
        message: 'Account created!',
        status: 'created'
      });
    });

    user.find({})
      .populate('accounts') // --> this is not working somehow
      .exec()
      .then((users) => {
        console.log('User - ', users);
      })
      .catch(err => {
        console.log('User err - ', err);
      });
  });
});

// GET
router.get('/', (req, res) => {
  res.json({ message: 'Welcome to accounts api' });
});

router.get('/accounts', (req, res) => {
  Account.find((err, accounts) => {
    if (err) { res.send(err); }
    res.json(accounts);
  });
});

router.get('/users', (req, res) => {
  User.find({})
    .populate('accounts') // --> this is not working somehow
    .exec((err, users) => {
      if (err) { res.send(err); }
      res.json(users);
    });
});

处理

User.accounts

这就是我到目前为止所做的,但while仍未填充。解决方案是什么?

2 个答案:

答案 0 :(得分:4)

您的问题的灵魂定义如下:

router.post('/accounts', (req, res) => {
    user = new User({
        title: 'Ms',
        firstName: 'Paula',
        lastName: 'Testerson',
        username: '@paulatest',
        avatar: '',
        email: 'paula.test@emailtest.com',
        dob: '01 January 1989',
        password: 'test123',
        createdAt: Date.now()
    });

    account = new Account({
        createdAt: Date.now(),
        accountNumber: 7651234,
        balance: 91.75,
        daysLeft: 23,
        nextMonthPayment: 19.57,
        paymentType: 'debit card',
        currentPlan: {
            name: 'Fast Furious',
            usage: {
                used: 10356,
                left: 89644,
                total: 100000,
                meta: {
                    trafficData: [{
                        date: 'Fri Dec 22 2017 14:42:14 GMT+0000 (GMT)',
                        amount: 100.50,
                        download: 20.65,
                        upload: 16.90
                    }],
                }
            }
        },
        user: user._id
    });

    user.accounts.push(account._id); // you have to pushed the account  id into newly created user doc
    user.save((err, savedUser) => {
        if (err) {
            res.send(err);
        }

        account.save(err => {
            if (err) {
                res.send(err);
            }

            // It is better approach to use populate rather than finding the user by using .find() method
            User.populate(savedUser, {
                path: 'accounts'
            }, (err, populatedUser) => {
                if (err) {
                    res.send(err);
                }
                console.log(populatedUser);

                // send response here //

            });
        });
    });
});

建议: 建立一个关系是最佳做法,在您的情况下,您在用户模型中引用帐户,在帐户模型中引用用户,这意味着双重引用。因此,要处理此问题,您应该在帐户模型或用户模型中的帐户中引用用户,而不是两者。

答案 1 :(得分:0)

在这种情况下,

populate不是正确的工具。 Mongoose具有用于处理子文档的特定数组命令。在这种情况下,您想要的是将项目推送到数组上以保存它。更新后,您需要保存文档。

User.find({}, function (err, doc) {
  if (err) { return console.error(err) }
  doc.accounts.push(someaccount._id)
  doc.save()
})

使用子文档的文档是here