我已经在mongodb shell上测试了以下聚合并且它工作正常,但是它似乎不适用于mongoose。我搜索过类似的主题和问题,但他们的解决方案并没有解决我的问题。
文档结构是这个
{
name,
id,
contacts:[{
contactId, //I need an array of this field
dateAdded
}, {
contactId,
dateAdded
},
{}..]
}
mongooose架构是:
var AccountSchema = new mongoose.Schema({
email: { type: String, unique: true },
password: { type: String },
name: {
first: { type: String },
last: { type: String },
full: { type: String }
},
contacts: [Contact]
});
这是聚合:
Account.aggregate({
$match: { _id: accountId }
}, {
$unwind:"$contacts"
},
{
$group: {
_id: '$_id',
list: { $push:'$contacts.accountId' }
}
}, {
$project: {
_id: 0,
contacts: 1
}
}, function(err, doc) {
// var l=doc.result[0].list;
callback(doc);
});
在Mongodb shell上,聚合返回一个contactID数组,如下所示,但它在Mongoose上返回一个空数组
{
"result" : [
{
"_id" : null,
"list" : [
ObjectId("xxxbnbnb2013-06-23T16:24:03.785Z"),
ObjectId("mnmnmnmui2013-06-23T16:24:04.688Z")
]
}
],
"ok" : 1
}
答案 0 :(得分:3)
您的查询似乎格式正确,我认为您应该在预测“列表”时预测“联系人”。我试着像你的那样格式化我的数据,以下查询对我有用。在shell中:
db.accounts.aggregate(
{ $unwind:"$contacts" },
{ $group: {
_id: '$_id',
list: { $push:'$contacts.contactId' }
}
},
{ $project: { _id: 0, list: 1 }} )
或者,使用mongoose框架,
Account.aggregate(
{ $unwind:"$contacts" },
{ $group: {
_id: '$_id',
list: { $push:'$contacts.contactId' }}},
{ $project: {
_id: 0,
list: 1 }},
function (err, res) {
if (err) //handle error;
console.log(res);
}
);
由于您已尝试在聚合查询的最终输出中禁止“_id”字段,因此我假设您真的只想获取所有帐户中所有contactIds的列表,而不感兴趣将它们链接回特定帐户。如果您想留下一长串contactIds(而不是每个原始帐户有一个列表的小文档),您可以改为运行此聚合查询:
db.accounts.aggregate(
{ $unwind:"$contacts" },
{ $group: {
_id: "allcontacts",
list: { $push:'$contacts.contactId' }
}}
)
或者,使用mongoose框架,
Account.aggregate(
{ $unwind:"$contacts" },
{ $group: {
_id: "allcontacts",
list: { $push:'$contacts.contactId' }}},
function (err, res) {
if (err) ;
console.log(res);
}
);