用于查找和插入嵌套数组元素的mongo java

时间:2016-01-11 18:49:16

标签: java mongodb

我有一个具有以下结构的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方法。哪一个使用以及如何以最有效的方式处理这个问题?

2 个答案:

答案 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