Вставить массив внутри объекта в MongoDB - PullRequest
13 голосов
/ 21 октября 2011

Я новичок в MongoDB, и я хочу вставить данные в mongodb, как это, но я не мог понять, как

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

мой код

    BasicDBObject obj = new BasicDBObject();
    obj.put("images", ....);
    for(Tag tag:tags){
    BasicDBObject tagsObj = new BasicDBObject();
    tagsObj.put("NNP",tag.getNNP());
    tagsObj.put("NN",tag.getNN());
    obj.put("tags",tagsObj);

    }

UPDATE: используя этот код

Mongo m = new Mongo();
DB db = m.getDB("test");
DBCollection coll = db.getCollection("tags");
for(Tag tag:tags){
    BasicDBList dbl = new BasicDBList();
    dbl.add(new BasicDBObject("NNP",tag.getNNP()));
    dbl.add(new BasicDBObject("NN", tag.getNNP()));
    BasicDBObject outer=new BasicDBObject("images", currentImageName).append("tags", dbl);
    coll.insert(outer);
                }

Я храню каждое изображение отдельно, потому что теги могут быть такими же для этого изображения

  {
      image = "cab",
      tags = [
                { "NNP", 0 },
                { "NN", 1 }
             ],
             [  {"NNP", 4 },
                { "NN", 5 } 
             ],
             [
                {"NNP", 0 },
                { "NN", 4 }
             ]

},

Спасибо

Ответы [ 3 ]

25 голосов
/ 21 октября 2011

В основном вы используете BasicDBObject для сопоставления значения ключа и BasicDBList для объектов массива. Для объекта в вашем вопросе вы должны сделать это:

BasicDBList dbl = new BasicDBList();
dbl.add(new BasicDBObject("NNP",0));
dbl.add(new BasicDBObject("NN", 1));
BasicDBOBject outer=new BasicDBObject("image", "cab").append("tags", dbl);

В API есть несколько удобных методов, чтобы сделать это немного менее многословным.

Отображение работает так:

for:  {"A":1}  use: new BasicDBObject("A",1)
for: {"A":1, "B":2}  use: new BasicDBObject("A",1).append("B",2)
for: {"A":{"B":2}}  use: new BasicDBObject("A",new BasicDBObject("B",2))
for: {"A":["B","C"]} use:
        BasicDBList dbl = new BasicDBList();
        dbl.add("B");
        dbl.add("C");
         ->  new BasicDBObject("A",dbl);
3 голосов
/ 21 октября 2011

Вы имели в виду, как это?

    BasicDBObject obj = new BasicDBObject();
    obj.put("image", ....);
    for(Tag tag:tags){
        BasicDBObject tagsObj = new BasicDBObject();
        tagsObj.put("NNP",tag.getNNP());
        tagsObj.put("NN",tag.getNN());
        obj.put("tags",tagsObj);
    }
0 голосов
/ 20 января 2016

Вот как я использую его при использовании mongo3.x:

предположим, что вы хотите, чтобы результат был таким: {"data": [{"key":"v1"}, {"key":"v1"}, {"key":"v1"}] }

[step1]: используйте Java Map для создания jsonобъект, который отображается на элементы внутри массива;то есть {} внутри []

[шаг1 Ответ]: Map m1,m2,m3 = new HashMap(); m1.put("key", "v1"); m2.put("key", "v1"); m3.put("key", "v1");

[шаг2]: использовать список Java, чтобы добавить все карты Java в один элемент.

[шаг2 Ответ]: List list = new ArrayList(); list.add(m1); list.add(m2); list.add(m3);

[шаг3]: добавить список Java в монго

[шаг3 Ответ]: Document dc = new Document("key", list);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...