【问题标题】:Mongoose: How to query for a referenced object property?Mongoose:如何查询引用的对象属性?
【发布时间】:2013-11-25 02:16:20
【问题描述】:

我正在尝试根据属性 a 子文档从我的数据库中获取文档列表。我使用的模型和模式是:

var elementSchema = new mongoose.Schema({
    name: String,
    description: String,

    _story: { type: mongoose.Schema.Types.ObjectId, ref: 'Story' },

    date_created: Date,
    date_modified: Date,
};
var storySchema = new mongoose.Schema({
    title: {type: String, default: '', trim: true},
    isPrivate: {type: Boolean, default: false},
});

mongoose.model("Story", storySchema);
mongoose.model("Element", elementSchema);

我正在尝试获取属于非私有故事的所有元素,根据我在这里看到的一些帖子(123),解决方案是使用 _story .isPrivate 与查找。我目前正在这样做:

Element.find({'_story.isPrivate': false})
         .populate('_story')
         .exec(function(err, elements){
             if(err){
                 return next(err);
             }
             else if(elements.length > 0){
                 return res.send(elements);
             }
             else{
                 return res.send(404, {message: "No elements found"});
             }
});

但结果总是一个空集(返回 404)。在没有条件的情况下,find 返回所有元素并正确填充 _story。我还激活了调试输出以查看正在执行的查询,我得到了这个:

Mongoose: elements.find({ '_story.isPrivate': false }) { fields: undefined, safe: undefined }

尝试在 MongoDB 中执行此操作我没有得到任何结果。这里有什么问题?

谢谢

【问题讨论】:

  • MongoDB 不支持连接。 _storypopulate 出现在 find 查询完成之后,因此您无法在查询中引用其字段。
  • 但是在我链接的问题中,他们通过使用我使用的查询解决了同样的问题。我就是不能让它和我的一起工作。
  • 它仅在故事文档嵌入到您的元素文档中时才有效,而不是在您的案例中作为参考时才有效。

标签: node.js express mongoose


【解决方案1】:

您可以重新订购您的模型并拥有

var storySchema = new mongoose.Schema({
    title: {type: String, default: '', trim: true},
    isPrivate: {type: Boolean, default: false},
    elements: [{type: mongoose.Schema.Types.ObjectId, ref: 'Element'}]
});

Story.distinct('elements', {'isPrivate':false}, function(error, results) { 
  /* handle callback */ 
}

通过这种方式,您可以发出单个调用并获得元素的集合。

【讨论】:

    【解决方案2】:

    收听@JohnnyHK。他说的是实话。 Mongodb 查询一次使用一个且仅一个且恰好一个集合中的数据。由于 'elements' 集合中的文档没有 _story.isPrivate 键路径,Element.find({'_story.isPrivate': false}) 永远不会匹配任何文档。 mongodb 中没有连接。真的。但是,鉴于“无连接”约束,仍然可以构建应用程序并满足用例,但您需要替代模式和查询设计。有时人们会非规范化他们的数据并复制内容。有时您会运行多个相关查询等。

    【讨论】:

    • 我猜 Mongoose 并没有提供任何工具来解决这个问题,对吧?
    • Mongoose 提供了query.populate() 函数、模式引用、嵌入式模式,所有这些都以与文档数据库协调工作的方式解决了可能在关系数据库中连接的用例。跨度>
    • 但是鉴于您当前的模式,没有猫鼬本身并没有任何相关的帮助者 AFAIK。但是,我见过的大多数设计最终都会更改其架构以使用例运行良好。当然,这都是艺术和权衡,而不是科学,所以你的应用程序的细节应该指导你的方法。
    • 谢谢!现在我想我必须(再次)重新考虑数据库。
    • 尝试在网络上搜索“mongodb schema recipes”以获得一些模式和想法。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2021-11-06
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多