{ "_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抓住它们。
答案 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 });
这应该可以让您了解如何解决问题。