好吧,我有以下几个Shemas:
var BrandSchema = new Schema({ name: { type: String, required: true, index: { unique: true }, lowercase: true }, logo: { type: ObjectId, ref: 'Image' } }); var FollowActionSchema = new Schema({ 'actionDate': { type: Date, 'default': Date.now }, 'brand': { type: ObjectId, ref: 'Brand' }, 'performer': { type: ObjectId, ref: 'User' }, 'type': String // followUser, folloBrand, followMerchant });
我想要的是让用户跟踪品牌,按品牌名排序,所以对于这样做,我对FollowAction进行查询,找到用户所做的所有FollowAction,然后填充brand字段。
所以问题是我不能为品牌名的查询排序,我知道的唯一方法是返回所有文档并从nodejs应用程序中对它们进行排序。有人知道我怎么能那样做吗??或者我是否应该改变shema结构??
我所做的查询是:
async.waterfall([ function findActions(next) { var options = { query: { performer: userId, $or: [{ type: 'followBrand' }, { type: 'followMerchant' }] }, projection: { actionDate: 1, brand: 1, merchant: 1, type: 1 }, sort: '-actionDate', pagination: pagination }; utils.limitQuery('FollowAction', options, next); }, function inflate(actions, next) { total = actions.count; var options = { projection: { name: 1, _id: 1, username: 1 } }; async.eachSeries(actions.result, function(action, done) { async.waterfall([ function inflateAction(done) { action.inflate(options, done); }, function addToArray(item, done) { trusted.push({ _id: item._id, name: utils.capitalize(item.name || item.username), type: item.name ? 'brand' : 'merchant' }); return done(null, item); } ], done); }, next); } ], function(err) { callback(err, trusted, total); });
从这个简单的例子中得到这个想法
Post.find({'_id': userId})
.limit(10)
.skip(0)
.sort({'created_at':-1}) // this is used to sort
.exec(function(error, result){
if(!error){
// console.log(result);
res.send({data:result});
} else{
console.log(error);
}
});
Mongoose API似乎确实支持对填充字段进行排序,但有一个bug完全破坏了它:https://github.com/automattic/Mongoose/issues/2202。你得到了一个结果,但它是完全错误的。
对于少量数据,可以使用Javascript array.prototype.sort()对结果数组进行排序。但请记住,这将直接修改排序数组。
在本例中,我所做的是为要排序的模型的模式添加一个排序键属性。对于您的示例,可以执行以下操作:
var FollowActionSchema = new Schema({
// ...
'brandSortKey': { type: String },
'brand': {
type: ObjectId,
ref: 'Brand'
},
// ...
});
这并不完美,因为您必须自己使用正确的键显式设置此属性:
var FollowAction = Model('FollowAction', FollowActionSchema);
var aBrand = // some brand object
var f = new FollowAction({
brand: aBrand._id,
brandSortKey: aBrand.name
// other properties
});
但是,您可以直接通过Mongoose API(或MongoDB)进行排序:
FollowAction.find({})
.sort({ brandSortKey:1 })
.exec(function (err, sortedResults) {
// do something with sorted results.
});
问题内容: 我使用Mongoose.js,无法解决3级层次结构文档的问题。 有2种方法可以做到。 首先 -没有裁判。 我需要出示C记录。仅知道_id的C,如何填充/找到它? 我曾尝试使用: 但是我不知道如何从returnet得到一个对象,我只需要c对象。 其次,如果使用裁判: 如何填充所有B,C记录以获取层次结构? 我试图使用这样的东西: 但是它将为single_c.title返回undefine
问题内容: 我有要查询的模型(称为“活动”)(使用Mongoose)。他们的架构如下所示: 当我询问他们,我填充,,,和字段(所有引用)。在那之后,我也深入了这个领域。这是我的查询代码: 这已经是一个相对复杂的查询,但是我需要做更多。如果它碰到了声明的一部分,我 还 需要确保的字段等于字符串。我尝试使用,但是由于必须先填充事件,因此无法查询其任何字段。我还需要在其他多个查询中实现相同的目标。 如我
问题内容: 我所做的: 我有一个模块 然后我有另一个课 我得到的是: 该作品不错,但字段为空。如果您编辑个人资料,则可以使用来向字段添加条目,但是我需要自动填写。 我的期望: 我希望打开个人资料时,每个设置为的记录都将在字段中可见。当我创建记录并将值设置为可以说时,该记录必须在字段中的配置文件中可见。如何实现呢? 问题答案: user_rel_ids =字段.many2many(comodel_n
我正在使用pdfbox-1.8.12从PDF中读取内容以获取XFA。我已经能够成功地为大多数文件获取XFA,而没有遗漏任何字段值。 问题在于一些文件,如错误。pdf。我有许多字段没有像CIN这样的值,但当我在任何PDF查看器、foxit或Acrobat中打开文件时,它会显示该字段。 然后将字节[]转换为字符串。 这是此文件的xfa,如果您在此搜索“U72300DL1996PLC075672”,它将
我有两个收藏,一个是用户,另一个是猫。我想要猫的数据下我的用户集合。但我没有得到。 user.js
Mongoose似乎不支持Mongo DBREF。显然,他们发布了“dbref”支持,但它实际上只是简单的引用(不具备引用不同集合中的文档的能力)。我终于创建了一个模式,允许我保存ObjectID引用的数组并填充它们,这对于我的模式的某些部分是很好的,但是如果我可以使用适当的DBREF创建一个数组,允许我引用来自多个集合的文档,那将是非常方便的。 幸运地(?)有一个模块可以在Mongoose中修补