我有以下Collection

{
    "_id" : ObjectId("57315ba4846dd82425ca2408"),
    "myarray" : [ 
        {
            userId : ObjectId("570ca5e48dbe673802c2d035"),
            point : 5
        },
        {
            userId : ObjectId("613ca5e48dbe673802c2d521"),
            point : 2
        },        
     ]
}

这些是我的问题

我想进入myarray如果userId不存在,它应该附加到myarray.如果userId存在,它应该更新到点.

我找到了这个

db.collection.update({
    _id : ObjectId("57315ba4846dd82425ca2408"),
    "myarray.userId" :  ObjectId("570ca5e48dbe673802c2d035")
}, {
    $set: { "myarray.$.point": 10 }
})

但如果userId不存在,什么都不会发生.

db.collection.update({
    _id : ObjectId("57315ba4846dd82425ca2408")
}, {
  $push: {
      "myarray": {
          userId: ObjectId("570ca5e48dbe673802c2d035"),
          point: 10
      }
  }
})

但如果userId个物体已经存在,它会再次推动.

在MongoDB中实现这一点的最佳方式是什么?

推荐答案

试试这个

db.collection.update(
    { _id : ObjectId("57315ba4846dd82425ca2408")},
    { $pull: {"myarray.userId": ObjectId("570ca5e48dbe673802c2d035")}}
)
db.collection.update(
    { _id : ObjectId("57315ba4846dd82425ca2408")},
    { $push: {"myarray": {
        userId:ObjectId("570ca5e48dbe673802c2d035"),
        point: 10
    }}
)

解释:

第二个是$push个插页

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

MongoDB中的字符串聚合

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

在 MongoDB 中加入多个集合

使用golang的MongoDB错误无法访问服务器

在我的查询中使用 populate() 时的 MongoDB createIndex()

如何替换mongodb中的动态键?

使用新字段插入数据或使用 updateOne mongodb 有条件地更新

TypeError:Cannot read property '_id' of undefined

Meteor mongo 驱动程序可以处理 $each 和 $position 运算符吗?

带有 mongodb 和 nodejs 的实时 Web 应用程序

Mongoose Schema vs Mongo Validator

MongoDB + Node JS + 基于角色的访问控制 (RBAC)

Mongodb KeyFile 太开放权限

mongo - Ruby连接问题

为什么我新创建的 mongodb 本地数据库增长到 24GB?

如何在 golang 和 mongodb 中通过 id 查找

使用 mongoengine 将多文档插入到 mongodb

带有 either or查询的mongoose findOne

有没有办法执行更新操作的dry run?