gpt4 book ai didi

node.js - 仅当 ref 不为空时才尝试填充 Mongoose - 不起作用

转载 作者:IT老高 更新时间:2023-10-28 13:15:26 26 4
gpt4 key购买 nike

我正在尝试获取包含作者信息的书籍列表。

一些用户被删除,因此他们在数据库中不再有文档,因此他们的信息为空。

我仅在其创作者仍然存在的情况下才尝试提取书籍。

这是我的代码:

  Book.find({_creator:{$ne:null}}).populate(
{
path: '_creator',
match: { _id: { $ne: null }}
})
.exec(function (err,books) {
if(err) throw err;
if(books) {
res.send(books)
}
})

这是它返回的内容:

  [
{
"_id":"55d98e6a4de71010099c59eb",
"dateOfCreation":"2015-08-23T09:12:10.095Z",
"_creator":null,
"__v":0,
"coverUrl":"cover14403211323926quv.png",
"description":"asdasd",
"name":"asdasd"
}
]

请注意,_creator 字段为空。这是为什么?

最佳答案

您需要了解代码的执行顺序:

  1. mongoose 从 {_creator:{$ne:null}} 的数据库中获取所有书籍。 Mongo 仅查看书籍集合中的引用资料以确定要返回的文档。您的书仍然有对作者的引用,mongo 不会注意到 Authors 集合中没有匹配的作者,因此您的书已加载。

  2. mongoose 正在填充所有返回的结果:因此它正在从 Authors 集合中加载作者并将引用替换为真实对象。对于您的书,它找不到匹配的作者,因此将 null 放在那里。

这就是你最终得到结果列表的原因。

Mongo 不支持连接 - 因此您不能执行包含来自多个集合的数据的查询。填充只是一种将结果列表中的引用替换为真实数据的方法,您永远不能将填充的数据用作 where 子句的一部分。

要解决您的问题,您可以:

  • 在 JS 代码中过滤你的最终结果列表,例如使用 _.filter 的 lodash 库。
  • 每当您删除作者时,更新您的所有书籍并删除引用。您可以使用 Author-Schema 上的 Hook 来执行此操作。

AuthorSchema.post('remove', function(doc) {//在这里更新你的书});

关于node.js - 仅当 ref 不为空时才尝试填充 Mongoose - 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com