如何从所有集合中获取信息,但仅获取数组项

时间:2019-03-31 18:53:59

标签: node.js mongodb mongoose

我将MongoDB与NodeJS一起使用,并以此方式将数据保存在名为“ posts”的集合中

     {
                "_id": "5ca0ff61f247dc29b8331af9",
                "tipo": "First Mongo Post",
                "user": {
                    "_id": "5ca01d2c56a2d9165c848f4f",
                    "nombre": "User1",
                    "email": "luis@gmail.com",
                    "permission": "Administrador",
                    "__v": 0
                },
                "rates": [
                    {
                        "user": "5ca01d2c56a2d9165c848f4f",
                        "votation": 1
                    },
                    {
                        "user": "5ca021b03904f70cf823b6e6",
                        "votation": -1
                    }
                ],
                "__v": 0
      }

我想以这种方式正确保存数据,无论如何,我想从我的集合中获取称为“帖子”的所有信息,但是名为 rates 的数组只希望获得与调用get方法的用户相同的用户对象。

例如,如果我调用我的 get 方法,并发送了用户ID(5ca01d2c56a2d9165c848f4f),则我想返回所有帖子集,但要在Rates数组中在每个对象中,我只希望具有与我在 get 方法中发送的ID相比具有相同ID的对象,例如:

 {
            "_id": "5ca0ff61f247dc29b8331af9",
            "tipo": "First Mongo Post",
            "user": {
                "_id": "5ca01d2c56a2d9165c848f4f",
                "nombre": "User1",
                "email": "luis@gmail.com",
                "permission": "Administrador",
                "__v": 0
            },
            "rates": [
                {
                    "user": "5ca01d2c56a2d9165c848f4f",
                    "votation": 1
                }
            ],
            "__v": 0
}

说实话,我不知道该怎么做,所以希望您能为我提供帮助或向我解释我该怎么做。

关于,我是新使用此技术的人

1 个答案:

答案 0 :(得分:0)

您可以分别存储Rate和Post对象,因此可以创建一个名为 rates 的新集合,以使Rates与Posts集合分开。在Rate集合中,您可以存储postId,userId和votation值

const mongoose = require('mongoose');

const RateSchema = new mongoose.Schema({
  userId: {
    type: String
  },
  postId: {
    type: String
  },
  votation: {
    type: Number,
  }
);
module.exports = mongoose.model('Rate', RateSchema);

之后,您可以创建一个函数来获取与userId和postId相关的费率,例如

const Rate = require('../models/Rate');
function getRatesByUserIdandPostId(userId, postId) {
   return Rate.find({userId, postId});
};

这样,您无需在for循环中搜索与该用户相关的费率,函数便会为您完成。另外,它的速度更快,因为您无法获得与某一特定帖子相关的所有费率。