检索数组的索引

我有这样的文件

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

我想findBar的索引

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

我可以检索用户数组内的酒吧索引吗? (在这种情况下:2)

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

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

有一个位置$操作符,它保持第一个匹配数组元素的“匹配”位置。 但是这个值本身不能被“投影”,只能用作占位符来返回匹配位置的数组元素:

 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()等操作来实现。