通过查询直接在mongodb中设置键的值和另一个键的值

时间:2019-01-28 12:06:02

标签: mongodb mongoose mongodb-query

我可以创建查询吗,如下所示

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 -%> 的值吗?

1 个答案:

答案 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 字段匹配而发生的更新,因此您无法在一个更新查询中更新多条记录