我有两个集合(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
答案 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”并且创建了一个新文档。如果它只是一个“匹配”,那么文档中的任何内容都不会改变。