13

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

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);

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

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 中执行此操作我没有得到任何结果。这里有什么问题?

谢谢

4

2 回答 2

10

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

于 2013-11-12T19:15:38.833 回答
4

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

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 */ 
}

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

于 2015-09-22T15:03:42.940 回答