我可以创建查询吗,如下所示
db.getCollection('walkins.businesses').update(
{$and:[{"loyaltyModule.isPublished": true},{"loyaltyModule.publishAt": {"$eq":null}}]},
{$set : {"loyaltyModule.publishAt":"this.loyaltyModule.creationAt"}}, {multi:true}
)
直接使用更新查询将creationAt
的值设置为publishAt
,将creationAt
的值设置为publishAt
。
我可以在同一文档中使用其他字段creationAt
设置<% end -%>
的值吗?
答案 0 :(得分:2)
具有汇总
执行此操作的最佳方法是使用聚合框架来计算新字段。 使用 $ addFields 和 $ out 聚合管道运算符。
db.getCollection('walkins.businesses').aggregate(
[
{$match : {$and:[{"loyaltyModule.isPublished": true},{"loyaltyModule.publishAt": {"$eq":null}}]}},
{ "$addFields": {
"loyaltyModule.publishAt":"loyaltyModule.creationAt"
}},
{ "$out": "collection" }
]
)
请注意,这不会更新您的收藏集,而是替换现有的收藏夹或创建一个新的收藏夹。另外,对于需要“类型转换”的更新操作,您将需要客户端处理,并且根据操作,您可能需要使用find()方法而不是 .aggreate()方法>
使用游标迭代
您可以迭代光标并更新
db.getCollection('walkins.businesses').find({$and:[{"loyaltyModule.isPublished": true},{"loyaltyModule.publishAt": {"$eq":null}}]}).forEach(function(x){
db.getCollection('walkins.businesses').update({_id : x._id },
{$set : {"loyaltyModule.publishAt": x.loyaltyModule.creationAt}},
{multi:true}
)
})
在这里,由于与 _id 字段匹配而发生的更新,因此您无法在一个更新查询中更新多条记录