搜尋

首頁  >  問答  >  主體

mongodb數組查詢

{
    'a': 1,
    'b':2,
    'c': 3,
    'd': [
        {'e': 4, 'f': 5, 'g': 6},
        {'e': 0, 'f': '', 'g': 3},
        {'e': 1, 'f': '', 'g': 3},
    ]
}
{
    'a': 1,
    'b':2,
    'c': 3,
    'd': [
        {'e': 4, 'f': '', 'g': 6},
        {'e': 0, 'f': '', 'g': 3},
        {'e': 1, 'f': '', 'g': 3},
    ]
}

這樣的記錄,問題是怎麼取得d數組中f都為空的文檔(如上的結果是文檔2)?謝謝

伊谢尔伦伊谢尔伦2763 天前502

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-04-24 09:13:43

      只知道這個用$where怎麼實現,其他方法我也暫時不知道。

    注意

    如果是經常性的查詢,強烈不建議使用$where,它会遍历所有文档,每个文档都会从BSON转换成javascript对象,然后通过表达式来处理,比常规查询慢很多,只有走投无路时才用。先使用常规查询进行过滤,然后再使用$where,这样组合使用可以降低性能损失。如果可能先使用索引进行过滤,$where,它會遍歷所有文檔,每個文檔都會從BSON轉換成javascript對象,然後透過表達式來處理,比常規查詢慢很多,只有走投無路時才用。先使用常規查詢進行過濾,然後再使用
    ,這樣組合使用可以降低效能損失。如果可能先使用索引進行過濾,

    只用於進一步過濾結果。
    ——————————————————————————————摘自《Mongodb權威指南(E2)》

    🎜代碼:🎜
    db.collection.find({"$where":function(){
        var d = this.d, i = 0, j = d.length;
        for(i,j;i<j;i++){
            if(d[i].f != "")return false;
        };
        return true;
    }});
    

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-24 09:13:43

    db.demo.find({d: {$not:{$elemMatch: {f: {$ne: ""}}}}})
    

    在mongo shell上測試了一下:

    > db.demo.insert({
    ...     'a': 1,
    ...     'b':2,
    ...     'c': 3,
    ...     'd': [
    ...         {'e': 4, 'f': '', 'g': 6},
    ...         {'e': 0, 'f': '', 'g': 3},
    ...         {'e': 1, 'f': '', 'g': 3},
    ...     ]
    ... } )
    WriteResult({ "nInserted" : 1 })
    > db.demo.insert({
    ...     'a': 1,
    ...     'b':2,
    ...     'c': 3,
    ...     'd': [
    ...         {'e': 4, 'f': 5, 'g': 6},
    ...         {'e': 0, 'f': '', 'g': 3},
    ...         {'e': 1, 'f': '', 'g': 3},
    ...     ]
    ... }
    ... )
    WriteResult({ "nInserted" : 1 })
    > db.demo.find({d: {$not:{$elemMatch: {f: {$ne: ""}}}}})
    { "_id" : ObjectId("54129ff745d4261bacca6dcd"), "a" : 1, "b" : 2, "c" : 3, "d" : [ { "e" : 4, "f" : "", "g" : 6 }, { "e" : 0, "f" : "", "g" : 3 }, { "e" : 1, "f" : "", "g" : 3 } ] }
    

    回覆
    0
  • 取消回覆