如何使用文档字段值作为$ slice的参数?

时间:2015-06-11 21:03:21

标签: mongodb

考虑这两个文件:

{ 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/

2 个答案:

答案 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;
&#13;
&#13;