我有一个具有以下结构的mongo集合元素
{
"_id" : ObjectId("568eaba5e4b0fa3cdf9aaf85"),
"type" : "X",
"textId" : "568eaba5e4b0fa3cdf9aaf84",
"createDate" : "2016-01-07 18:17:09",
"likes" : [
{
"creatorName" : "ABCD",
"creationDate" : "2016-01-10 19:48:37",
"likeId" : "56932615569aae9d1459eb9b"
}
]
}
我的需求如下: 当一个新的like由一个creatorName为textId标识的特定元素发布时,我应该 a)检查特定textId对象的creatorName是否已存在。如果在场,不做任何事 b)如果不存在,我应该在like arrays
中插入一个新元素如何在java中有效地做到这一点?我看到我们有一个更新方法和一个findAndModify方法。哪一个使用以及如何以最有效的方式处理这个问题?
答案 0 :(得分:1)
<强> Unique indexes 强>
您可以按如下方式创建唯一索引:
db.collection.createIndex( { "likes.creatorName": 1 }, { unique: true } )
官方文件说:
唯一索引会导致MongoDB拒绝包含a的所有文档 索引字段的重复值。
如果 creatorName 已存在,则写入操作将失败,如下所示:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: test.collection.$likes.creatorName_1 dup key: { : 1.0 }"
}
})
然后,您不必担心creatorName是否已存在。
另一方面,如果您需要知道creatorName是否已经存在,您需要查看WriteResult返回值(0或1)。
答案 1 :(得分:0)
您可以使用查询条件.respond({})
函数插入喜欢的内容:
update
如果您尝试为同一db.collection.update({
"textId" : "568eaba5e4b0fa3cdf9aaf84",
"likes.likeId": {"$nin": ["56932615569aae9d1459eb10"]},
"likes.creatorName" : {"$nin": ["ABCE"]}
},
{
"$push" : {
"likes" : {
"creatorName" : "ABCE",
"creationDate" : "2016-01-10 21:48:37",
"likeId" : "56932615569aae9d1459eb10"
}
}
}
)
Updated 1 existing record(s)
添加新内容,则不会更新。
creatorName
Java驱动程序没有任何性能优势。
如果根据查询条件添加db.collection.update({
"textId" : "568eaba5e4b0fa3cdf9aaf84",
"likes.likeId": {"$nin": ["56932615569aae9d1459eb11"]},
"likes.creatorName" : {"$nin": ["ABCD"]}
},
{
"$push" : {
"likes" : {
"creatorName" : "ABCD",
"creationDate" : "2016-01-11 19:48:37",
"likeId" : "56932615569aae9d1459eb11"
}
}
}
)
Updated 0 record(s)
,则会提高性能。 (只需要一次)
index