2014-01-21 4 views
0
> db.foo.save({'foo': [{f0: 'a', f1: 'b'}, {f0: 'c', f1: 'd'}]}) 
> db.foo.save({'foo': [{f0: 'a', f1: 'e'}, {f0: 'f', f1: 'g'}]}) 
> db.foo.save({'foo': [['a', 'b'], ['c', 'd']]}) 
> db.foo.save({'foo': [['a', 'e'], ['f', 'g']]}) 
> db.foo.find({}, {'foo.f1': 1}) 
{ "_id" : ObjectId("52dddf7cbeb971f4081ea48a"), "foo" : [ { "f1" : "b" }, { "f1" : "d" } ] } 
{ "_id" : ObjectId("52dddf83beb971f4081ea48b"), "foo" : [ { "f1" : "e" }, { "f1" : "g" } ] } 
{ "_id" : ObjectId("52dddf88beb971f4081ea48c"), "foo" : [ [ ], [ ] ] } 
{ "_id" : ObjectId("52dddf8dbeb971f4081ea48d"), "foo" : [ [ ], [ ] ] } 
> db.foo.find({}, {'foo.1': 1}) 
{ "_id" : ObjectId("52dddf7cbeb971f4081ea48a"), "foo" : [ { }, { } ] } 
{ "_id" : ObjectId("52dddf83beb971f4081ea48b"), "foo" : [ { }, { } ] } 
{ "_id" : ObjectId("52dddf88beb971f4081ea48c"), "foo" : [ [ ], [ ] ] } 
{ "_id" : ObjectId("52dddf8dbeb971f4081ea48d"), "foo" : [ [ ], [ ] ] } 

У меня есть несколько вопросов, связанных с вложенными массивами, как это (обратите внимание, что практически все так вопросы с вложенным массивом в названии на самом деле относятся к отдельным массивам вложенных в корне документ, а не 2D вложенные массивы. Насколько мне известно, это не дубликат).проекция и индекс на 2D вложенных массивов в MongoDB

  • Есть ли способ выполнить проекцию, как указано выше, на двумерные вложенные массивы?
  • Как создать индекс для второго элемента массивов в массиве foo? Опять же, предположительно foo.1 не будет работать.

Я знаю правильный ответ (TM) является не сделать это и использовать массив поддокументов, пустышки (NDTAUAAOSD), но а) любопытство - я не могу найти ответ и б), к сожалению, обстоятельства вне моего контроля диктуют структуру документа.

UPDATE: Разъяснение того, что я хотел бы видеть из проекций:

db.foo.find({}, {'foo.1': 1}) 
{ "_id" : ObjectId("52dddf88beb971f4081ea48c"), "foo" : [ ['b'], ['d'] ] } 
{ "_id" : ObjectId("52dddf8dbeb971f4081ea48d"), "foo" : [ ['e'], ['g'] ] } 

В основном нарезка через внутренние массивы.

ответ

0

Вы можете использовать позиционную $ оператор для проекций: http://docs.mongodb.org/manual/reference/operator/projection/positional/

Хотя я не совсем уверен, что ваш запрос пытается проецировать на, вот пример:

> db.foo.find() 
{ "_id" : ObjectId("5321ac073ac852396029fb90"), "foo" : [ { "f0" : "a", "f1" : "b" }, { "f0" : "c", "f1" : "d" } ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb91"), "foo" : [ { "f0" : "a", "f1" : "e" }, { "f0" : "f", "f1" : "g" } ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb92"), "foo" : [ { "f0" : "a", "f1" : "b" }, { "f0" : "c", "f1" : "d" }, { "f0" : "a", "f1" : "z" } ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb93"), "foo" : [ [ "a", "b" ], [ "c", "d" ] ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb94"), "foo" : [ [ "a", "e" ], [ "f", "g" ] ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb95"), "foo" : [ [ "a", "e" ], [ "f", "g" ], [ "a", "z" ] ] } 

// get the array document which has a field "f0" which matches "a" 
b.foo.find({ "foo.f0" : "a" }, { "foo.$" : 1 }) 
{ "_id" : ObjectId("5321ac073ac852396029fb90"), "foo" : [ { "f0" : "a", "f1" : "b" } ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb91"), "foo" : [ { "f0" : "a", "f1" : "e" } ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb92"), "foo" : [ { "f0" : "a", "f1" : "b" } ] } 
//^see that the last return document only returns the first array element match 

// get the array element of the foo array 
> db.foo.find({ "foo" : { "$elemMatch" : { "$in" : [ "a" ] } } }, { "foo.$" : 1 }) 
{ "_id" : ObjectId("5321ac073ac852396029fb93"), "foo" : [ [ "a", "b" ] ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb94"), "foo" : [ [ "a", "e" ] ] } 
{ "_id" : ObjectId("5321ac073ac852396029fb95"), "foo" : [ [ "a", "e" ] ] } 
//^see that the last return document only returns the first array element match 
+0

Уточнено OQ к укажите, что я надеюсь на повторное проектирование 2D-массивов. – elhefe

Смежные вопросы