检索数组的索引

时间:2014-08-07 10:56:49

标签: javascript node.js mongodb mongoose mongodb-query

我有这样的文件

...
"users" : [ 
        {
            "name":"Bob"
        }, 
        {
            "name":"Foo"
        }, 
        {
            "name":"Bar"
        },
        {
            "name":"Boo"
        }
    ]

...

我想查找Bar的索引

db.coll.find({"users.name":"Bar"})

我可以在Users数组中检索Bar的索引吗? (在这种情况下:2)

1 个答案:

答案 0 :(得分:1)

我真的不认为你问的问题会导致你想要的实际答案,但我会通过一些事情来澄清一些误解。

.find()等操作仅返回文档中的“字段”。它不会以任何方式创造“新结果”。唯一存在的例外是$meta操作,当与$text运算符一起用于文本搜索时,目前只有“textScore”。

有一个positional $运算符,可以“保持”第一个匹配的数组元素的“匹配”位置。但是这个值本身不能“预测”,只能用作占位符,以便在该匹配位置返回一个数组元素:

db.collection.find({ "users.name": "Bar" }, { "users.$": 1 })

只返回数组中的匹配元素而没有其他元素。

为了获得实际的匹配位置,通常需要在代码中检查数组,以便找到匹配的索引位置。因此,检索文档,然后检查数组以找到匹配的索引。

如果你想在多个文档上执行此操作,那么你几乎可以在mapReduce操作中执行相同的操作。有关使用mongoose的完整示例:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

var userFieldSchema = new Schema({
  name: String
},{ "_id": false });

var userSchema = new Schema({
  users: [userFieldSchema]
});


var User = mongoose.model( "User", userSchema, "users" );


var value = "Bar";
var o = {};

o.map = function() {
  emit( this._id, this.users.map(
    function(x) { return x.name == value  }).indexOf(true)
  );
};

o.reduce = function(){};

o.query = {  "users.name": value };
o.scope = { value: value };

User.mapReduce(o, function(err,results) {
  if ( err ) throw err;

  console.log( results );

});

返回的结果是与条件匹配的文档的_id以及正在测试的数组中相应的匹配“索引”值。

只有mapReduce和aggregate等操作实际上“更改”了他们在返回结果中处理的文档的内容。因此,目前没有任何实现可以通过.find()等操作实现这一点。