gpt4 book ai didi

java - MongoDB Java : Finding objects in Mongo using QueryBuilder $in operator returns nothing

转载 作者:可可西里 更新时间:2023-11-01 09:09:06 25 4
gpt4 key购买 nike

我有一个名为 MongoRuleJUnit 规则

public class MongoRule extends ExternalResource {

private static final Logger LOGGER = LoggerFactory.getLogger(MongoRule.class);
private final MongoService mongoService;

public MongoRule() throws UnknownHostException {
mongoService = new MongoService(getConfiguredHost(), getConfiguredPort(), getConfiguredDatabase());
}

@Override
protected void before() throws Throwable {
LOGGER.info(" Setting up Mongo Database - " + getConfiguredDatabase());
}

@Override
protected void after() {
LOGGER.info("Shutting down the Mongo Database - " + getConfiguredDatabase());
mongoService.getMongo().dropDatabase(getConfiguredDatabase());
}

@Nonnull
public DB getDatabase() {
return mongoService.getMongo().getDB(getConfiguredDatabase());
}

@Nonnull
public Mongo getMongo() {
return mongoService.getMongo();
}

@Nonnull
public MongoService getMongoService() {
return mongoService;
}

public static int getConfiguredPort() {
return Integer.parseInt(System.getProperty("com.db.port", "27017"));
}

@Nonnull
public static String getConfiguredDatabase() {
return System.getProperty("com.db.database", "database");
}

@Nonnull
public static String getConfiguredHost() {
return System.getProperty("com.db.host", "127.0.0.1");
}
}

然后我尝试如下插入一些文档

 public static void saveInDatabase() {
LOGGER.info("preparing database - saving some documents");
mongoRule.getMongoService().putDocument(document1);
mongoRule.getMongoService().putDocument(document2);
}

其中 document1document2 是有效的 DBObject 文档。架构看起来像

{
Id: 001
date_created: 2012-10-31
vars: {
'1': {
name: n1
value:v1
}
'2': {
name: n2
value:v2
}
'3': {
name: n3
value:v3
}

}
{
Id: 002
date_created: 2012-10-30
vars: {
'1': {
name: n4
value:v4
}
'2': {
name: n5
value:v5
}
'3': {
name: n6
value:v6
}

}

现在我尝试查询集合并获取这些对象,所以我这样做

public static void getDocuments(List<String> documentIds) {
BasicDBList docIds = new BasicDBList();
for (String docId: documentIds) {
docIds.add(new BasicDBObject().put("Id", docId));
}
DBObject query = new BasicDBObject();
query.put("$in", docIds);
DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query);
System.out.println(dbCursor == null);
if (dbCursor != null) {
while (dbCursor.hasNext()) {
System.out.println("object - " + dbCursor.next());
}
}
}

mycollection 是保存所有文档的集合,它来自外部服务。
当我运行此文档时,我看到以下内容

preparing database - saving some documents
inserting document - DBProposal # document1
inserting document - DBProposal # document2
false

这意味着 collection.find() 找不到这些文件。

我在这里没有做什么?我怎样才能取回文件?

我对将 JavaMongo 结合使用还很陌生,并使用了这个 reference构造查询

更新
更改构造查询的方式后,我仍然看不到文档

public static void getDocuments(List<String> documentIds) {
BasicDBList docIds = new BasicDBList();
docIds.addAll(documentIds)
DBObject query = new BasicDBObject();
query.put("$in", docIds);
DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query);
System.out.println(dbCursor == null);
if (dbCursor != null) {
while (dbCursor.hasNext()) {
System.out.println("object - " + dbCursor.next());
}
}
}

集合名称通过

返回
private static String getCollectionName(@Nonnull final DBObject dbObject) {
return "mycollection";
}

最佳答案

你现在做的相当于:

db.col.find({$in:[{Id:id1}, {Id:id2}, ..., {Id:idN}]})

这不是一个有效的查询,因为您没有指定要 $in 的字段。我假设你想要:

db.col.find({Id:{$in:[id1, id2, ..., idN]}})

相应地更改您的查询构造代码,您应该没问题。

编辑:添加正确的代码:

public static void getDocuments(List<Integer> documentIds) {

BasicDBList docIds = new BasicDBList();
docIds.addAll(documentIds)
DBObject inClause = new BasicDBObject("$in", docIds);
DBObject query = new BasicDBObject("Id", inClause);
DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query);
System.out.println(dbCursor == null);
if (dbCursor != null) {
while (dbCursor.hasNext()) {
System.out.println("object - " + dbCursor.next());
}
}
}

请注意,这里假设“Id”不是“_id”

关于java - MongoDB Java : Finding objects in Mongo using QueryBuilder $in operator returns nothing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11650970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com