如何在MongoDB集合中搜索嵌套在数组中的字典键

5

我有一些数据存储在MongoDB数据库的集合中(我知道是哪个集合,所以只查看该集合),文档看起来像这样:

{ "_id" : ObjectId("52a93577dadf672b96062729"), 
  "owner" : "user1", 
  "files" : [  
              {  "IyzkmGh4YGD61Tc3TJjaEY17hDldH" : "rws" } 
            ] 
}
{ "_id" : ObjectId("52a92f43dadf672b96062725"), 
  "owner" : "user2", 
  "files" : [    
              {       "tUI7RtvpHZklptvHVYssamlgHP6xs" : "rws" },
              {       "RsxRDQdXmHgmSLhMJ8tPxILxarruK" : "rws" },    
              {       "IyzkmGh4YGD61Tc3TJjaEY17hDldH" : "rw" },      
              {       "YA4to7HaB5Gm6JuZrwYrFit7IzvgO" : "rws" } 
           ] 
}

我正在尝试想出一种方法,以查找所有在它们内部的文件数组中具有特定字典键的文档。例如,对于样本数据,如果我使用字符串“ IyzkmGh4YGD61Tc3TJjaEY17hDldH”进行搜索,则希望两个样本都匹配,因为它们都具有在其文件列表中具有该键的字典。我应该如何执行此查询?我正在使用Python motor来访问MongoDB。原因是我希望在表示它们的文件不存在时删除这些条目。方案在我的掌握之中,我可以更改它以使这种搜索更加明智。
1个回答

11
您可以在查询键中使用点表示法来实现此操作,使用$exists运算符仅检查存在性:
db.test.find({'files.IyzkmGh4YGD61Tc3TJjaEY17hDldH': {'$exists': 1}})

要查找所有包含这些文件的文档并将它们删除:

db.test.update(
    {'files.IyzkmGh4YGD61Tc3TJjaEY17hDldH': {'$exists': 1}},
    {'$pull': {'files': {'IyzkmGh4YGD61Tc3TJjaEY17hDldH': {'$exists': 1}}}},
    multi=True)

有什么想法如何删除这个条目(们)吗?我尝试了不同的变体,但都没有成功: db.user_data.update({'projects.IyzkmGh4YGD61Tc3TJjaEY17hDldH': {'$exists': 1}},{ $pull : { 'projects' : 'IyzkmGh4YGD61Tc3TJjaEY17hDldH' }}) - mike
太棒了,它运行成功了。我从来不知道我可以用{'$exists':1}引用刚找到的文档的值,MongoDB很酷。这个用例在哪里解释了?我在这里找不到:http://docs.mongodb.org/manual/reference/operator/query/exists/。你肯定懂MongoDB。 - mike
@mike,你不是在引用使用$exists找到的文档的值,而是仅仅使用它来识别要从files$pull的元素,就像你用它来识别要更新的文档一样。 - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接