考虑这两个文件:
{ currentIndex: 1, elements: [4, 5, 6] }
{ currentIndex: 2, elements: [4, 5, 6] }
如何获得此结果,按照elements
处的currentIndex
元素排序?
{ currentIndex: 1, elements: [5] }
{ currentIndex: 2, elements: [6] }
我读过$ slice [1],但似乎它的参数不能是动态的。所有示例都使用实际整数作为它的参数,而不是用于标识文档中用作索引的值的字符串。
[1] http://docs.mongodb.org/manual/reference/operator/projection/slice/
答案 0 :(得分:1)
如果currentIndex是唯一的,或者您可以为Collection添加唯一字段,那么您可以使用mapreduce:
db.coll.mapReduce(
function() {
emit(this.currentIndex, { currentIndex: this.currentIndex, elementAtCurrentIndex: this.elements[this.currentIndex]});
}, function(key, values) {
return values[0];
}, {
out: "result"
}
)
db.result.find({}, {"value.currentIndex":1, "value.elementAtCurrentIndex":1, _id:0}).sort({"value.elementAtCurrentIndex":1})
答案 1 :(得分:0)
对于相对较小的数据集,您可以使用光标方法 forEach()
来迭代光标并访问文档,使用JavaScript的原生 {{3} 方法获取所需的数组并将结果保存到另一个集合,如下例所示:
db.collection.find().forEach(function (doc){
doc.elements = doc.elements.splice(doc.currentIndex, 1);
db.result.save(doc);
})
查看下面的演示
var cur = [
{ currentIndex: 1, elements: [4, 5, 6] },
{ currentIndex: 2, elements: [4, 5, 6] }
];
var results = [];
cur.forEach(function (doc){
doc.elements = doc.elements.splice(doc.currentIndex, 1);
results.push(doc);
});
pre.innerHTML = JSON.stringify(results);

<pre id="pre"></pre>
&#13;