我有这样的文件
...
"users" : [
{
"name":"Bob"
},
{
"name":"Foo"
},
{
"name":"Bar"
},
{
"name":"Boo"
}
]
...
我想查找Bar的索引
db.coll.find({"users.name":"Bar"})
我可以在Users数组中检索Bar的索引吗? (在这种情况下:2)
答案 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()
等操作实现这一点。