我对Mongoose和MongoDB很新,所以我很难搞清楚这样的事情是否可行:
Item = new Schema({
id: Schema.ObjectId,
dateCreated: { type: Date, default: Date.now },
title: { type: String, default: 'No Title' },
description: { type: String, default: 'No Description' },
tags: [ { type: Schema.ObjectId, ref: 'ItemTag' }]
});
ItemTag = new Schema({
id: Schema.ObjectId,
tagId: { type: Schema.ObjectId, ref: 'Tag' },
tagName: { type: String }
});
var query = Models.Item.find({});
query
.desc('dateCreated')
.populate('tags')
.where('tags.tagName').in(['funny', 'politics'])
.run(function(err, docs){
// docs is always empty
});
Run Code Online (Sandbox Code Playgroud)
这有更好的方法吗?
编辑
为任何困惑道歉.我要做的是获取包含有趣标签或政治标签的所有项目.
编辑
没有where子句的文件: …
我有一个非常简单的$lookup聚合查询,如下所示:
{'$lookup':
{'from': 'edge',
'localField': 'gid',
'foreignField': 'to',
'as': 'from'}}
Run Code Online (Sandbox Code Playgroud)
当我在匹配足够的文档时运行它时,我收到以下错误:
Command failed with error 4568: 'Total size of documents in edge
matching { $match: { $and: [ { from: { $eq: "geneDatabase:hugo" }
}, {} ] } } exceeds maximum document size' on server
Run Code Online (Sandbox Code Playgroud)
所有限制文件数量的尝试都失败了.allowDiskUse: true什么也没做.发送输入cursor无效.添加$limit到聚合中也会失败.
怎么会这样?
然后我再次看到错误.哪里是$match和$and与$eq从何而来?幕后的聚合管道是否会$lookup调用另一个聚合,一个是自己运行的聚合管道,我无法为游标提供限制或使用游标.
这里发生了什么?
我知道使用它skip来实现分页是一种不好的做法,因为当数据变大skip时会开始消耗大量内存.解决这个问题的一种方法是按_id字段使用自然顺序:
//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...
//Page 2
users = db.users.find({'_id'> last_id}). limit(10);
Run Code Online (Sandbox Code Playgroud)
问题是 - 我是mongo的新手,不知道最好的方法是什么 last_id