2015-05-13 44 views
1

我有一個只有ObjectID的對象數組,並且想要搜索具有這些ID的所有文檔的集合。mongodb:搜索一個對象數組中的所有ID的集合

var array = [{ _id: 5551e59be360594cd3319644 }, 
      { _id: 5551e59be360594cd3319631 }, 
      { _id: 5551e59be360594cd33195d2 }, 
      { _id: 5551e59be360594cd3319627 }]; 

這裏就是我目前做的,讓我的結果:

for (var i = 0; i < array.length; i++) { 
    db.collection('test').findOne({_id:array[i]._id}, function(err, matched) { 
    console.log(matched); 
}); 

我試圖與$in運營商的工作,但沒有成功,因爲它不是一個ID數組,但數組帶有這些ID的對象。

是否有另一種方法只用一個數據庫查詢來做到這一點,因爲我認爲在for循環中執行如此多的數據庫查詢並不是一個好主意。

編輯 我現在與地圖方法試了一下(如@chrisdam解釋),所以我有一組ID,但是當我把它傳遞給find方法我得到這樣的結果:

EDIT2 沒關係我的第一次編輯。 find()只返回一個遊標,而不是文檔本身。所以我用toArray()。感謝您的幫助@chrisdam!

{ db: 
    { domain: null, 
    _events: {}, 
    _maxListeners: undefined, 
    databaseName: 'test', 
    serverConfig: { 
     domain: null, 
     _events: {}, 
     _maxListeners: undefined, 
     auth: [Getter], 
     _callBackStore: [Object], 
     _commandsStore: [Object], 
     _dbStore: [Object], 
     host: 'localhost', 
     port: 27017, 
     options: [Object], 
     internalMaster: true, 
     connected: true, 
     poolSize: 5, 
     disableDriverBSONSizeCheck: false, 
     _used: true, 
     replicasetInstance: null, 
     emitOpen: false, 
     ssl: false, 
     sslValidate: false, 
     sslCA: null, 
     sslCert: undefined, 
     sslKey: undefined, 
     sslPass: undefined, 
     serverCapabilities: [Object], 
     name: 'localhost:27017', 
     socketOptions: [Object], 
     logger: [Object], 
     eventHandlers: [Object], 
     _serverState: 'connected', 
     _state: [Object], 
     recordQueryStats: false, 
     socketTimeoutMS: [Getter/Setter], 
     _readPreference: [Object], 
     db: [Circular], 
     dbInstances: [Object], 
     connectionPool: [Object], 
     isMasterDoc: [Object] }, 
    options: { 
     read_preference_tags: null, 
     read_preference: 'primary', 
     url: 'mongodb://localhost:27017/test', 
     native_parser: true, 
     readPreference: [Object], 
     safe: false, 
     w: 1 }, 
    _applicationClosed: false, 
    slaveOk: false, 
    bufferMaxEntries: -1, 
    native_parser: true, 
    bsonLib: { 
     BSON: [Object], 
     Long: [Object], 
     ObjectID: [Object], 
     DBRef: [Object], 
     Code: [Object], 
     Timestamp: [Object], 
     Binary: [Object], 
     Double: [Object], 
     MaxKey: [Object], 
     MinKey: [Object], 
     Symbol: [Object] }, 
    bson: { promoteLongs: true }, 
    bson_deserializer: { 
     Code: [Object], 
     Symbol: [Object], 
     BSON: [Object], 
     DBRef: [Object], 
     Binary: [Object], 
     ObjectID: [Object], 
     Long: [Object], 
     Timestamp: [Object], 
     Double: [Object], 
     MinKey: [Object], 
     MaxKey: [Object], 
     promoteLongs: true }, 
    bson_serializer: { 
     Code: [Object], 
     Symbol: [Object], 
     BSON: [Object], 
     DBRef: [Object], 
     Binary: [Object], 
     ObjectID: [Object], 
     Long: [Object], 
     Timestamp: [Object], 
     Double: [Object], 
     MinKey: [Object], 
     MaxKey: [Object], 
     promoteLongs: true }, 
    _state: 'connected', 
    pkFactory: { 
     [Function: ObjectID] 
     index: 13651524, 
     createPk: [Function: createPk], 
     createFromTime: [Function: createFromTime], 
     createFromHexString: [Function: createFromHexString], 
     isValid: [Function: isValid], 
     ObjectID: [Circular], 
     ObjectId: [Circular] }, 
    forceServerObjectId: false, 
    safe: false, 
    notReplied: {}, 
    isInitializing: true, 
    openCalled: true, 
    commands: [], 
    logger: { error: [Function], log: [Function], debug: [Function] }, 
    tag: 1431517732801, 
    eventHandlers: { 
     error: [], 
     parseError: [], 
     poolReady: [], 
     message: [], 
     close: [] }, 
    serializeFunctions: false, 
    raw: false, 
    recordQueryStats: false, 
    retryMiliSeconds: 1000, 
    numberOfRetries: 60, 
    readPreference: { _type: 'ReadPreference', mode: 'primary', tags: undefined } }, 
    collection: { 
    db: { 
     domain: null, 
     _events: {}, 
     _maxListeners: undefined, 
     databaseName: 'test', 
     serverConfig: [Object], 
     options: [Object], 
     _applicationClosed: false, 
     slaveOk: false, 
     bufferMaxEntries: -1, 
     native_parser: true, 
     bsonLib: [Object], 
     bson: [Object], 
     bson_deserializer: [Object], 
     bson_serializer: [Object], 
     _state: 'connected', 
     pkFactory: [Object], 
     forceServerObjectId: false, 
     safe: false, 
     notReplied: {}, 
     isInitializing: true, 
     openCalled: true, 
     commands: [], 
     logger: [Object], 
     tag: 1431517732801, 
     eventHandlers: [Object], 
     serializeFunctions: false, 
     raw: false, 
     recordQueryStats: false, 
     retryMiliSeconds: 1000, 
     numberOfRetries: 60, 
     readPreference: [Object] }, 
    collectionName: 'sick', 
    internalHint: null, 
    opts: {}, 
    slaveOk: false, 
    serializeFunctions: false, 
    raw: false, 
    readPreference: { _type: 'ReadPreference', mode: 'primary', tags: undefined }, 
    pkFactory: { 
     [Function: ObjectID] 
     index: 13651524, 
     createPk: [Function: createPk], 
     createFromTime: [Function: createFromTime], 
     createFromHexString: [Function: createFromHexString], 
     isValid: [Function: isValid], 
     ObjectID: [Circular], 
     ObjectId: [Circular] }, 
    serverCapabilities: undefined }, 
    selector: { _id: { '$in': [Object] } }, 
    fields: undefined, 
    skipValue: 0, 
    limitValue: 0, 
    sortValue: undefined, 
    hint: null, 
    explainValue: undefined, 
    snapshot: undefined, 
    timeout: true, 
    tailable: undefined, 
    awaitdata: undefined, 
    oplogReplay: undefined, 
    numberOfRetries: 5, 
    currentNumberOfRetries: 5, 
    batchSizeValue: 0, 
    raw: false, 
    readPreference: { _type: 'ReadPreference', mode: 'primary', tags: undefined }, 
    returnKey: undefined, 
    maxScan: undefined, 
    min: undefined, 
    max: undefined, 
    showDiskLoc: undefined, 
    comment: undefined, 
    tailableRetryInterval: 100, 
    exhaust: false, 
    partial: false, 
    slaveOk: false, 
    maxTimeMSValue: undefined, 
    connection: undefined, 
    transforms: undefined, 
    totalNumberOfRecords: 0, 
    items: [], 
    cursorId: { _bsontype: 'Long', low_: 0, high_: 0 }, 
    dbName: undefined, 
    state: 0, 
    queryRun: false, 
    getMoreTimer: false, 
    collectionName: 'test.sick' } 
+0

爲什麼不循環遍歷列表並使用ID創建一個新列表,然後使用'$ in'運算符來使用它。 – sirfz

+0

@Sir_FZ我們基本上是用地圖功能做到的,不是嗎? – anstaendig

回答

3

你可以嘗試JavaScript的原生map方法生成的ObjectID數組,然後你可以用$in操作使用方法如下:

var array = [{ _id: "5551e59be360594cd3319644" }, 
      { _id: "5551e59be360594cd3319631" }, 
      { _id: "5551e59be360594cd33195d2" }, 
      { _id: "5551e59be360594cd3319627" }],  
    ids = array.map(function (obj){ return ObjectId(obj._id)}); 

db.collection.find({ "_id": { "$in": ids }}); 

或者僅使用$or運營商爲:

var array = [{ _id: "5551e59be360594cd3319644" }, 
      { _id: "5551e59be360594cd3319631" }, 
      { _id: "5551e59be360594cd33195d2" }, 
      { _id: "5551e59be360594cd3319627" }],  
    ids = array.map(function (obj){ return { _id: ObjectId(obj._id) } }); 

db.collection.find({ "$or": ids }); 
相關問題