MongoDB:特定字段的子对象数组唯一

时间:2014-07-22 00:17:55

标签: mongodb python-2.7 pymongo

我不确定MongoDB是否可以实现这一点。我找不到任何东西。

所以我的结构如下:

{ "_id" : ObjectId("53cda1b0e03ab68fd4d8eb5e"), 
"radio_id" : "aoeuoae", 
"user_id" : "aoeuaoe", 
"email" : "", 
"songs" : 
    [ { "song_id" : ObjectId("53cda1b0e03ab68fd4d8eb5f"), 
        "added" : ISODate("2014-07-21T23:26:40.499Z"), 
        "liked" : 0, 
        "listened" : false }, 
      { "song_id" : ObjectId("53cda1b0e03ab68fd4d8eb60"), 
        "added" : ISODate("2014-07-21T23:26:40.499Z"), 
        "liked" : 0, 
        "listened" : false }]}

因此歌曲会继续添加,而song_id会引用另一组歌曲。

我想要做的是让song_id在歌曲数组中独一无二。所以如果你试图添加另一个元素,如:

 "song_id" : ObjectId("53cda1b0e03ab68fd4d8eb60"), 
        "added" : ISODate("2014-07-21T23:26:40.499Z"), 
        "liked" : 0, 
        "listened" : false }

所以我可能会推出类似的东西:

> db.users.update({'email':'jordan@howlett.io'}, {$push: {'songs': {'song_id': ObjectId("53cda1b0e03ab68fd4d8eb64")}}})

它不会起作用。

这可能吗?感谢。

1 个答案:

答案 0 :(得分:2)

这是我过去最好的解决方法。有两个电话。

found = db.col.find( {/*query*/}).count()
if found = 0:
    // update
    db.col.insert(storage_dict)
else:
    db.col.update({/*find the subdocument*/},{"$set":{'title : "Foo"}})

您也可以使用upsert参数“播放”,但我不建议使用像这样的子文档。