2011-04-06 122 views
1

我想知道是否有任何方法可以进行复杂的选择。 考虑下面的文档集合:MongoDB数组谓词

{ 
    image = "cab" 
    tags = [ 
      [ "NNP", 0 ], 
      [ "NN", 1 ] 
     ] 
}, 
{ 
    image = "castle" 
    tags = [ 
      [ "NNP", 2 ], 
      [ "NN", 1 ], 
      [ "VB", 0 ] 
     ] 
}, 
(etc) 

我将如何表达,检查是否tags包含任何元素一样,例如查询,["NN", ?]在那里我根本不关心内部数组的整数部分?请注意,内部数组是无序的,整数值是任意分配的。

请注意,我是mongodb的新成员,可能忽略了在文档中执行此操作的方法。然而,我无法顺利使用$elemMatch :-(

回答

3

我建议稍微另一个模式:

{ 
    image = "cab" 
    tags = [ 
      { name: "NNP", order: 0 }, 
      { name: "NN", order: 1 } 
     ] 
} 

有三个原因,为什么我提出另一个方案:

  1. 首先是因为两级嵌套通常难以查询/更新
  2. 标签数组中的数组包含不同类型的元素(int,string)
  3. A标签阵列内rray看起来像我的两个字段

随着上述模式'标签对象,你可以用一些名称和顺序标签容易查询:

db.images.find({ "tags.name" : "NN", "tags.order" : 1 }) 

更新:

Dot notation文档

希望得到这个帮助!

+0

谢谢。我很怀疑。尽管你的查询不能立即执行,因为'tags'仍然是一个对象数组,但是发出一个'.find({“tags”:{$ elemMatch:{“tag”:“NN”}}})'did这个技巧在你的模式中很好。 – Manny 2011-04-06 09:14:27

+0

@曼尼:我的查询都可以;)。 '.find({“tags”:{$ elemMatch:{“tag”:“NN”}}})'给出与.find相同的结果({“tags.tag”:“NN”)'。只要看看[文档](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24elemMatch)或询问是否需要。另外我在我的答案中添加了'点符号'文档的链接。 – 2011-04-06 09:36:43