Upsert而不是save mongodb

时间:2015-08-24 07:36:07

标签: mongodb

我有两个集合(so和temp_so)。

我的查询:

' goto end of document
Selection.EndKey Unit:=wdStory
With Selection.Find
    .Text = crntValue
    .Forward = False    ' from bottom to top
    .Format = False
    ' adapt to your needs
    .MatchCase = False
    .MatchWholeWord = False
End With
' Check if the string was found
If Selection.Find.Execute() Then
    ' goto end of line
    Selection.EndKey Unit:=wdLine
    ' and insert new line
    Selection.TypeParagraph
    ' now you're ready to insert your entry
Else
    MsgBox "Sorry, " & crntValue & " was not found.", vbExclamation
End If

我在temp_so中有一个db.getCollection('temp_sale_order').find({},'orderItemId'). forEach(function(element) { db.getCollection('sale_order').save(element); }); 123的文档。我想检查是否存在orderItemId的文档,然后查询应该更新整个文档。如果具有orderItemId的文档不存在,则应该创建一个。

查询应该对temp_so中的所有文档执行此操作。

我当前的查询只是插入数据,并且不检查具有orderItemId的文档是否存在。如何纠正它?

在SQL中,这可以写成:

orderItemId

1 个答案:

答案 0 :(得分:1)

从技术上讲,.save()操作已经是“upsert”周围的“包装器”,它只是只查看_id字段,并且只显示它。

所以你只需要明确你正在查找哪个字段。并删除现有的_id

db.getCollection('temp_sale_order').find({},{ 'orderItemId': 1 }).
  forEach(function(element) { 
     delete element._id;
     db.getCollection('sale_order').update(
        { "orderItemId": element.orderItemId },
        element,
        { "upsert": true }
     );
 });

您可能还认为您不想替换整个文档,而只是“插入”第一次出现。这是$setOnInsert在这里做的:

db.getCollection('temp_sale_order').find({},{ 'orderItemId': 1}).
  forEach(function(element) { 
     delete element._id;
     db.getCollection('sale_order').update(
        { "orderItemId": element.orderItemId },
        { "$setOnInsert": { "orderItemid": element.orderItemId } },
        { "upsert": true }
     );
 });

这基本上意味着$setOnInsert中的任何更改都不会被实际应用,除非这实际上是一个“upsert”并且创建了一个新文档。如果它只是一个“匹配”,那么文档中的任何内容都不会改变。