考虑以下是我存储在集合 Users
中的文档
{
_id : "User1",
joined : ISODate("2011-03-02"),
likes : {
sublikes: [
{WebsiteID:'001': WebsiteName: 'ABCD'},
{WebsiteID:'002': WebsiteName: '2BC2'},
{WebsiteID:'003': WebsiteName: '3BC3'},
//...........
//...........
{WebsiteID:'999999': WebsiteName: 'SOME_NAME'}
]
}
}
现在使用 mongodb 聚合框架,我需要获取它
collection.aggregate([
{ $project: {
_id: 1,
"UserID": "$_id",
"WebsiteName": "$likes.sublikes[0]['WebsiteName']"
}
},
{ $match: { _id: 'User1'} }
], function (err, doc) {
///Not able to get the WebsiteName: 'ABCD'
});
如果我使用
$unwind
文档变得批量(特别是在上面的情况下),所以我不想为了只获取数组中的第一个项目而展开它(不考虑其他项目)谁能给我一些关于如何访问 is 和重命名该字段的提示?
更新 1:即使我尝试使用
"WebsiteName": "$likes.sublikes.0.WebsiteName"
进行投影。没有用:-(更新 2: Unresolved 问题 - https://jira.mongodb.org/browse/SERVER-4589
截至目前
$at
不起作用。抛出错误:{ [MongoError: exception: invalid operator '$at']
name: 'MongoError',
errmsg: 'exception: invalid operator \'$at\'',
code: 15999,
ok: 0 }
直到那时使用
$unwind
// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
最佳答案
获得结果的最简单方法是使用普通的 find 查询和 $slice
运算符:
db.collection.find( {_id: "User1"}, {"likes.sublikes": {$slice: 1}} )
聚合框架(在 MongoDB 2.4.1 中)不支持
$slice
或数组索引(投票/观看功能请求:SERVER-6074 和 SERVER-4589)。您可以使用
$unwind
、 $group
和 $first
运算符在聚合框架中执行此操作,例如:db.collection.aggregate([
{ $match: {
_id : "User1"
}},
{ $unwind: "$likes.sublikes" },
{ $group: {
_id: "$_id",
like: { $first: "$likes.sublikes" }
}},
{ $project: {
_id: 0,
"UserID": "$_id",
"WebsiteName": "$like.WebsiteName"
}}
])
正常的
$slice
应该是性能最好的选项。