Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果存在对象,则将其推入数组(按字段检查),否则在MongoDB中设置对象_Mongodb_Reactivemongo_Play Reactivemongo - Fatal编程技术网

如果存在对象,则将其推入数组(按字段检查),否则在MongoDB中设置对象

如果存在对象,则将其推入数组(按字段检查),否则在MongoDB中设置对象,mongodb,reactivemongo,play-reactivemongo,Mongodb,Reactivemongo,Play Reactivemongo,这是我目前拥有的文件: { "_id" : ObjectId("5adef141502f49a6a2812016"), "productId" : "123456", "users" : [ { "userId" : "1111111", "internalUserId" : "azxcvdd" }, { "userId" : "2222222

这是我目前拥有的文件:

{ 
    "_id" : ObjectId("5adef141502f49a6a2812016"), 
    "productId" : "123456", 
    "users" : [
        {
            "userId" : "1111111", 
            "internalUserId" : "azxcvdd"
        }, 
        {
            "userId" : "2222222", 
            "internalUserId" : "dsdasd"
        }
    ]
}
如果不存在,我希望将新用户推送到阵列, 如果userId存在并且internalUserId不同,我想更新它

所以如果我得到userId:“1111111”和internalUserId:“bbbb” 该文件将是:

{ 
    "_id" : ObjectId("5adef141502f49a6a2812016"), 
    "productId" : "123456", 
    "users" : [
        {
            "userId" : "1111111", 
            "internalUserId" : "bbbb"
        }, 
        {
            "userId" : "2222222", 
            "internalUserId" : "dsdasd"
        }
    ]
}
如果我得到userId:“44444”和internalUserId:“bbbb” 医生会来的

{ 
    "_id" : ObjectId("5adef141502f49a6a2812016"), 
    "productId" : "123456", 
    "users" : [
        {
            "userId" : "1111111", 
            "internalUserId" : "bbbb"
        }, 
        {
            "userId" : "2222222", 
            "internalUserId" : "dsdasd"
        }, 
        {
            "userId" : "44444", 
            "internalUserId" : "bbbb"
        }
    ]
}
我试着做这样的事情:

val selector = Json.obj("productId" -> productId)
val modifier = Json.obj("$addToSet" -> Json.obj("users" -> Json.obj("userId" -> user.userId, "internalUserId" -> user.internalUserId)))
        for {
          collection <- collectionFut
          writeResult <- collection.findAndUpdate(selector, modifier, upsert = true)
val selector=Json.obj(“productId”->productId)
val modifier=Json.obj($addToSet->Json.obj(“用户”-->Json.obj(“userId”-->user.userId,“internalUserId”-->user.internalUserId)))
为了{

集合在mongo shell中尝试此功能

    var cur = db.col.aggregate([ 
   { "$unwind": "$users" }
     ]);


     while (cur.hasNext()) {
     var doc = cur.next();
      db.col.update({ "users.userId": "1111" },
              { "$set": { "users.internalUserId": "bbbb" }},
              {'upsert':true});
       }

ArrayFilter是3.6版中引入的一项新功能,使用它我们可以将此功能与一起使用。使用

db.collection.update(
   { "users.userId" : "1111111" },
   { $set: { "users.$[elem].internalUserId"  : "bbbb"} },
   { arrayFilters: [ { "elem.userId": "1111111" } } ], upsert: true }
)