如果存在对象,则将其推入数组(按字段检查),否则在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 }
)