执行批量更新操作:根据数组中名称的存在增加数组内的对象属性

时间:2015-07-13 23:05:39

标签: mongodb mongodb-query

我正在组装一个标签集合,我需要在启用了upsert的情况下执行更新操作。

**编辑我调用的函数添加到集合中的标签传递一个tags数组,其中包含用户输入的标签,使用标签的类别的名称以及条目的实际标题。

类别的名称很重要,因为我希望能够记录来自使用相同标签的用户的提交数量也使用相同的类别,这就是为什么我有一个条目变量,每当我添加一个标签时,该变量应该递增已经有那个特定的类别。此数组名为categories并具有对象,此数组中的每个对象都具有categoryName属性以及对此特定标记使用相同类别的条目数。我还有一个用户条目标题数组,这个数组包含字符串。

function updateTags(tags, name, simpleString)
{
     var bulk = myModel.collection.initializeUnorderedBulkOp();

     for(var t = 0; t < tags.length, t++)
{

//important bit..

  bulk.find({tag : tags[t]}).upsert().update({ //Query to update document views or a new object to the categories array  })
}

bulk.execute(cb);

}

这是查询应该执行的一种算法方法。

- 检查是否存在标签

- 如果存在标签,请检查categories数组中条目的任何categoryName属性是否与传递给函数的类别名称匹配

---如果数组中已存在特定的categoryName,则将其条目增加一个。

- 如果categoryName不存在,则添加一个对象,其属性categoryName设置为传递给函数的名称,并将其条目设置为1。

无论以前在categories数组中是否存在categoryName,都要将标题(字符串)添加到标题条目数组中。

- 如果标签不存在,则添加带有标签的文档,带有单个对象的类别数组,其中catagoryName设置为传递的类别名称,其条目设置为1。还要将标题添加到标题属性数组中。

1 个答案:

答案 0 :(得分:1)

你基本上是正确的,因为这些是&#34; Bulk&#34;操作,因为你需要&#34;不止一个&#34;更新声明:

function updateTags(tags,name,title,callback) {
    var bulk = myModel.collection.initializeOrderedBulkOp();

   tags.forEach(function(tag) {

       // Update where the category does exist
       bulk.find({ 
           "tag": tag,
           "categories.name": name
       }).updateOne({
           "$inc": { "categories.$.count": 1 },
           "$addToSet": { "titles": title }
       });

       // Push where the category does not exist           
       bulk.find({ 
           "tag": tag, 
           "categories.name": { "$ne": name } 
       }).updateOne({
           "$push": { "categories": { "name": name, "count": 1 } },
           "$addToSet": { "titles": title }
       });

       // Upsert where the tag was not found, but do nothing else
       // Other than add the title to the set
       bulk.find({ "tag": tag }).upsert().updateOne({
           "$setOnInsert": {
               "categories": [{ "name": name, "count": 1 }],
               "titles": [title]
           },
       });

   });

   bulk.execute(callback);
}    

那么&#34;每个&#34; tag,是对服务器构造三个不同的请求。设置条件使得每个请求中只有一个&#34;一个&#34;将实际匹配文档并进行修改。

实际上可能会有两个&#34;每套匹配,但只有#34;一个&#34;他们可以做任何修改。这是因为$setOnInsert不适用于匹配的&#34;带有&#34; upsert&#34;的文档操作。因此,该操作确实没有&#34;没有&#34;除非&#34;标签&#34;没有匹配,并创建了一个新文档。

一旦建立了每个标记的所有请求,您将发送到服务器并接收响应。响应中的修改计数将始终等于&#34;标记的数量&#34;作为论点发送。