【发布时间】:2015-12-27 16:57:09
【问题描述】:
我有 3 个 ObjectIds 数组我想连接成一个数组,然后按创建日期排序。 $setUnion 正是我想要的,但我想尝试不使用它。
我要排序的对象的架构:
var chirpSchema = new mongoose.Schema({
interactions: {
_liked : ["55035390d3e910505be02ce2"] // [{ type: $oid, ref: "interaction" }]
, _shared : ["507f191e810c19729de860ea", "507f191e810c19729de860ea"] // [{ type: $oid, ref: "interaction" }]
, _viewed : ["507f1f77bcf86cd799439011"] // [{ type: $oid, ref: "interaction" }]
}
});
所需结果:将 _liked、_shared 和 _viewed 连接到一个数组中,然后使用 aggregate 管道按创建日期对它们进行排序。见下文
["507f1f77bcf86cd799439011", "507f191e810c19729de860ea", "507f191e810c19729de860ea", "55035390d3e910505be02ce2"]
我知道我应该以某种组合方式使用$push、$each、$group 和$unwind,但我无法将文档拼凑起来以实现这一目标。
更新:查询
model_user.aggregate([
{ $match : { '_id' : { $in : following } } }
, { $project : { 'interactions' : 1 } }
, { $project : {
"combined": { $setUnion : [
"$interactions._liked"
, "$interactions._shared"
, "$interactions._viewed"
]}
}}
])
.exec(function (err, data) {
if (err) return next(err);
next(data); // Combined is returning null
})
【问题讨论】:
-
Whist “连接”数组是可能的,“按日期排序” 是不可能的。您似乎在另一个集合中的引用数据中引用诸如“日期”之类的信息。 MongoDB 不以任何方式执行连接,并且 mongoose populate 也不是连接,也不能在聚合管道的中间执行。也就是说,
ObjectId值包含一个日期组件,因此如果足够的话,它们至少会按照创建顺序进行排序。 -
@BlakesSeven,对不起,我没有更具体。我需要按创建顺序排序。您能否展示连接是如何完成的,或者指出我的资源?
标签: node.js mongodb mongoose mongodb-query aggregation-framework