如何解决为什么猫鼬不允许我在_id上通过$ in查找,除非我有一个包装其他模式的模式? 请注意,只有一条记录:
请帮助任何人解释以下情况。我已经花了几个小时才找到一个可行的解决方案,但是为什么需要这种方式实现却没有意义。
由于某种原因,如果我使用1个mongoose模式通过nodejs连接mongo,则无法通过$ in搜索。 当我将单个模式包装到另一个模式中时,没有其他信息,$ in返回一个匹配项。
注意:命令行始终有效。因此,这与强制执行架构的方式有关。
我是猫鼬的新手,所以也许我遗漏了一些明显的东西,但这没有任何意义。任何帮助表示赞赏。 谢谢
在docker中创建数据
请注意,只有一条记录:
#!/bin/bash
set -e
mongo <<EOF
use ${MONGO_DB_NAME}
db.createCollection("persons")
db.persons.insert({"name": "CPU"})
EOF
schema.ts
import { Model,Schema,Document,Connection } from 'mongoose';
interface IPerson {
_id: string;
name: string;
};
type TSchemaPerson = Schema<IPerson>;
const SchemaPerson: TSchemaPerson = new Schema({
_id: String,name: String
});
// ##########################################################################
// ODD BEHAVIOUR ?
// I have to wrap SchemaPerson inside SchemaPersons,// even though its basically a duplication in order to get $in to return a result
// --------------------------------------------------------
// \/
const SchemaPersons: Schema<TSchemaPerson> = new Schema({SchemaPerson});
// ##########################################################################
const collectionName: string = 'Person';
export type TDocumentPerson = Model<Document & IPerson>;
export type TConnPersons = (con: Connection) => TDocumentPerson;
// ##########################################################################
// ODD BEHAVIOUR ?
// If I return SchemaPerson instead of SchemaPersons here then $in does not return a result --------
// \/
const ModelPersons: TConnPersons = con => con.model(collectionName,SchemaPersons);
// ##########################################################################
export default ModelPersons;
graphql-resolver.ts
const persons: QueryResolvers['persons'] = async (parent,args,context) => {
console.log('persons()');
const { dbConn }: IContext = context;
if (dbConn) {
const Person: TDocumentPerson = ModelPersons(dbConn);
let result;
let resultIn;
try {
result = await Person.find().exec();
console.log('result = ',result); // Result in both cases = [ { _id: 5f36e199ebd39f53b437834b,name: 'CPU' } ]
resultIn = await Person.find({
_id: {
$in: [new ObjectId('5f36e199ebd39f53b437834b')]
}
}).exec();
// ##########################################################################
// ODD BEHAVIOUR ?
// Result with SchemaPersons = [ { _id: 5f36e199ebd39f53b437834b,name: 'CPU' } ]
// Result with SchemaPerson = [ ]
console.log('resultIn = ',resultIn);
// ##########################################################################
} catch (err) {
console.log('err = ',err);
}
}
};
请注意,如果我将模型更改为集合,则可以正常工作。见下文:
schema.ts-作为集合连接
import { Schema,Collection,Connection } from 'mongoose';
interface IPerson {
_id: string;
name: string;
};
type TSchemaPerson = Schema<IPerson>;
const SchemaPerson: TSchemaPerson = new Schema({
_id: String,name: String
});
export type TCollectionPersons = Collection & IPerson;
export type TConnPersons = (con: Connection) => TCollectionPersons;
const CollectionPersons: TConnPersons = con => con.collection('persons',SchemaPerson)
export default CollectionPersons;
resolver.ts
const persons: TCollectionPersons = CollectionPersons(dbConn);
let result;
let resultIn;
let resultById
try {
result = await persons.find().toArray();
console.log('result = ',result);
// Result [ { _id: 5f36e199ebd39f53b437834b,name: 'CPU' } ]
resultIn = await persons.find({
_id: {
$in: [new ObjectId('5f36e199ebd39f53b437834b')]
}
}).toArray();
console.log('resultIn = ',resultIn);
// Result [ { _id: 5f36e199ebd39f53b437834b,name: 'CPU' } ]
// cannot use findById on collection.
// resultById = await persons.findById('5f36e199ebd39f53b437834b');
} catch (err) {
console.log('err = ',err);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。