在MongoDB中替换或跳过部分数组

时间:2013-11-22 16:23:39

标签: mongodb

假设我有一个包含以下文档的集合:

{
    "_id": ";lkajsdflhkadfhaewifjasdkfjalksdfjs",
    "tree": [
        { "id": "a", "name": "One" },
        { "id": "b", "name": "Two" },
        { "id": "c", "name": "Three" },
        { "id": "d", "name": "Four" }
    ]
}

现在假设我想用{,1}和c条目替换tree数组中的a,b和c条目。是否可以用更新查询替换?如果没有,有没有办法选择文档,使tree数组只包含c和d条目(或只是d条目)?我希望我的文档看起来像这样:

{
    "_id": ";lkajsdflhkadfhaewifjasdkfjalksdfjs",
    "tree": [
        { "id": "e", "name": "Five" },
        { "id": "f", "name": "Six" },
        { "id": "c", "name": "Three" },
        { "id": "d", "name": "Four" }
    ]
}

tree数组的顺序很重要。我知道$splice,但我提前不知道c条目的索引。此外,索引可能因文档而异。我可以在$splice内部查询,让我找到索引吗?

1 个答案:

答案 0 :(得分:1)

如何做一个find()。forEach?

db.test.find().forEach(function(doc){for (var i = 0; i < doc.tree.length; i++){
  switch(doc.tree[i].id){
    case "a": doc.tree[i] = { "id": "e", "name": "Five" };
    break;
    case "b": doc.tree[i] = { "id": "f", "name": "Six" };
    break;
  }} db.test.save(doc)});

当然,您可以使用更具体的逻辑来符合您的规则,但这只会将e和b替换为f。