Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否可以获取ID为'的猫鼬种群的所有数据;s_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js 是否可以获取ID为'的猫鼬种群的所有数据;s

Node.js 是否可以获取ID为'的猫鼬种群的所有数据;s,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我试图在API端点中创建一个查询,用于获取所有文档和子文档。目前,我只幸运地获取了每个子文档的ID,而没有获取每个文档中的所有信息。是否可以使用mongoose(以及父文档中的数据)根据每个ID从每个子文档中提取数据 我按照文档进行了深入填充:,但运气不太好 这是我当前的代码,它“有效”,但只响应每个子文档的ID(以及用户数据,这很好) 要从子文档中提取所有信息而不是仅提取ID,我缺少什么?将字段名称传递给填充,而不是模型名称: const allUsers = await User.find(

我试图在API端点中创建一个查询,用于获取所有文档和子文档。目前,我只幸运地获取了每个子文档的ID,而没有获取每个文档中的所有信息。是否可以使用mongoose(以及父文档中的数据)根据每个ID从每个子文档中提取数据

我按照文档进行了深入填充:,但运气不太好

这是我当前的代码,它“有效”,但只响应每个子文档的ID(以及用户数据,这很好)


要从子文档中提取所有信息而不是仅提取ID,我缺少什么?

将字段名称传递给
填充
,而不是模型名称:

const allUsers = await User.find()
  .populate("posts")
  .exec();

在其他填充中使用填充

.populate({
      path: 'document',
      populate: { path: 'sub document'}
    })

正如JohnnyHK所说,您需要使用字段的名称来填充

如果您有空的帖子数组,请检查您的用户集合,如果您有带有帖子ID的帖子数组

以下是我可以让它工作的步骤:

1-)在posts集合中插入2篇类似的帖子

{
    "_id" : ObjectId("5dc6cd65067a61191839ff38"),
    "name" : "name 3",
    "description" : "description 3",
    "date" : ISODate("2019-11-09T17:29:57.249+03:00")
}
{
    "_id" : ObjectId("5dc6cd5d067a61191839ff37"),
    "name" : "name 2",
    "description" : "description 2",
    "date" : ISODate("2019-11-09T17:29:49.070+03:00")
}
2-)插入了具有这两个帖子id的用户

{
    "_id" : ObjectId("5dc6cf5b67da8a40cc519866"),
    "posts" : [
        ObjectId("5dc6cd5d067a61191839ff37"),
        ObjectId("5dc6cd65067a61191839ff38")
    ],
    "name" : "user 1",
    "date" : ISODate("2019-11-09T17:38:19.807+03:00")
}

3-)并使用以下路径在用户中获取帖子

router.get("/allUsers", async (req, res) => {
  const allUsers = await User.find().populate("posts");

  res.send(allUsers);
});
结果如下:

[
    {
        "posts": [
            {
                "_id": "5dc6cd5d067a61191839ff37",
                "name": "name 2",
                "description": "description 2",
                "date": "2019-11-09T14:29:49.070Z",
                "__v": 0
            },
            {
                "_id": "5dc6cd65067a61191839ff38",
                "name": "name 3",
                "description": "description 3",
                "date": "2019-11-09T14:29:57.249Z",
                "__v": 0
            }
        ],
        "_id": "5dc6cf5b67da8a40cc519866",
        "name": "user 1",
        "date": "2019-11-09T14:38:19.807Z",
        "__v": 0
    }
]
顺便说一句您的用户和后期建模并不理想。每次用户发布时,必须更新用户文档

我将使用以下模式(父引用)

用户模型(我删除了posts字段,并添加了虚拟功能)

发布模型(我添加了用户ID)


通过这种方式,当用户发布时,用户文档不会受到影响。您可以使用相同的/allUsers路由来获取包含帖子的用户。

这只是返回一个空的帖子数组,为什么?打开mongoose调试来查看它在做什么:
mongoose.set('debug',true)猜测我在其他地方遇到了另一个错误,因为这仍然不起作用。我最终只是使用了一个帖子数组,而不是仅仅引用Id,但我猜你的答案是正确的。
[
    {
        "posts": [
            {
                "_id": "5dc6cd5d067a61191839ff37",
                "name": "name 2",
                "description": "description 2",
                "date": "2019-11-09T14:29:49.070Z",
                "__v": 0
            },
            {
                "_id": "5dc6cd65067a61191839ff38",
                "name": "name 3",
                "description": "description 3",
                "date": "2019-11-09T14:29:57.249Z",
                "__v": 0
            }
        ],
        "_id": "5dc6cf5b67da8a40cc519866",
        "name": "user 1",
        "date": "2019-11-09T14:38:19.807Z",
        "__v": 0
    }
]
const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  date: { type: Date, default: Date.now }
}, {
  toJSON: { virtuals: true },
  toObject: { virtuals: true }
});

userSchema.virtual("posts", {
  ref: "Post",
  foreignField: "userId",
  localField: "_id"
})

const User = mongoose.model("User", userSchema);

module.exports = User;
const mongoose = require("mongoose");

const postSchema = new mongoose.Schema({
    name: { type: String, required: true },
    description: { type: String, required: true },
    date: { type: Date, default: Date.now },
    userId: { type: mongoose.Schema.ObjectId, ref: "User" }
});

const Post = mongoose.model("Post", postSchema);

module.exports = Post;