更新MongoDB中给定案例的查询

时间:2014-07-16 11:55:10

标签: mongodb nlp

{ "_id" :,
   "final_terms" : [
        {
            "np" : "the role",
            "tf" : 28571.000,
            "idf" : 0
        }]
}

如何更新并将标志设置为1,排名前30%由final_terms.idf按降序排序,其余为0

{ "_id" :,
   "final_terms" : [
        {
            "np" : "the role",
            "tf" : 28571.000,
            "idf" : 0
            "flag": 0
        }]

}

我是mongodb的新手,我需要为nlp做这个,mongodb文档不太注重细节,很难用mongodb抓住它们。

1 个答案:

答案 0 :(得分:1)

我会分步进行。首先,您需要知道结果集中将包含多少文档,以便您可以找出前30%的文档。其次,您执行一个查询,按final_terms.idf递减顺序对文档进行排序,并确定final_terms.idf的值是结果集前30%中最后一个文档的值。了解这一点后,您可以更新final_terms.idf值大于或等于flag: 1的所有文档以及所有其他flag: 0的文档。确切的实现取决于您的编程语言,但mongo shell中的实现如下所示:

// Get count
> db.collection.find().count();
100

现在您知道您有100个文档,因此前30%将是前30个文档。跳过排序结果中的前29个,找到第30个文档的值:

// Sort and get value for 30th document
> db.collection.find({}, { "final_terms.idf" : 1, "_id" : 0} ).sort({ "final_terms.idf" : -1 }).skip(29).limit(1);
{ "final_terms" : { "idf" : "<SOME_VALUE>" } }

您现在拥有前30%的下限值。使用该值执行相应的更新:

// Update top 30%
db.collection.update({ "final_terms.idf" : { $gte : <SOME_VALUE> }}, { $set : { "final_terms.flag" : 1 } }, { "multi" : true });

// Update bottom 70%
db.collection.update({ "final_terms.idf" : { $lt : <SOME_VALUE> }}, { $set : { "final_terms.flag" : 0 } }, { "multi" : true });

这应该可以让您了解如何解决问题。