NutzCN Logo
问答 nutzmongo 中 if-else 和 正则表达式应如何处理
发布于 2988天前 作者 苍蓝猛兽 2307 次浏览 复制 上一个帖子 下一个帖子
标签:

问题如题。

贴一段正则表达式的代码,求解答

@IocBean
public class UserService {
// 按需注入几个核心对象
	@Inject
	protected ZMongo zMongo; // 注意大小写与配置的名字一致
	@Inject
	protected ZMoDB zMoDB; // 当前
	@Inject
	ZMoCo zMoCo;

        public List<User> query(ZMoDoc cnd) {
		List<User> list = new ArrayList<User>();
		DBCursor cursor = zMoCo.find(cnd);
		while (cursor.hasNext()) {
			DBObject obj = cursor.next();
			list.add(ZMo.me().fromDocToObj(obj, User.class));
		}
		return list;
	}
         
        public static void main(String[] args) {

		UserService userService = MongoDB.ioc.get(UserService.class);

                List<User> userList = userService.query(ZMoDoc.NEW("{'name':'/o/i'}"));

		for (User user2 : userList) {
			System.out.println(user2.toString());
		}

        }
}

日志中无内容打印

数据库数据如下:

/* 1 */
{
    "_id" : ObjectId("58046202f9c5ff1a10b82400"),
    "age" : "15",
    "name" : "OK",
    "id" : 1
}

/* 2 */
{
    "_id" : ObjectId("5805b21c478e3386ca09e52a"),
    "age" : 1.0,
    "name" : "tom"
}
13 回复

https://docs.mongodb.com/manual/reference/operator/aggregation/cond/

试试

ZMoDoc cnd = ZMoDoc.NEW("age", ZMocDoc.NEW("$cond: { if: { $gte: [ \"$qty\", 250 ] }, then: 30, else: 20 }"))

全是json,看你怎么拼方便了

@wendal 运行过后报错

List<User> userList = userService.query(ZMoDoc.NEW("age",
				ZMoDoc.NEW("$cond: { if: { $gte: [ \"$age\", 2 ] }, then: 30, else: 20 }")));
		for (User user2 : userList) {
			System.out.println(user2.toString());
		}

日志如下

Exception in thread "main" com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'unknown operator: $cond' on server 127.0.0.1:27017
	at com.mongodb.operation.FindOperation$1.call(FindOperation.java:489)
	at com.mongodb.operation.FindOperation$1.call(FindOperation.java:480)
	at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:239)
	at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:212)
	at com.mongodb.operation.FindOperation.execute(FindOperation.java:480)
	at com.mongodb.operation.FindOperation.execute(FindOperation.java:77)
	at com.mongodb.Mongo.execute(Mongo.java:772)
	at com.mongodb.Mongo$2.execute(Mongo.java:759)
	at com.mongodb.DBCursor.initializeCursor(DBCursor.java:851)
	at com.mongodb.DBCursor.hasNext(DBCursor.java:152)
	at com.hoperun.elvish.service.UserService.query(UserService.java:47)
	at com.hoperun.elvish.service.UserService.main(UserService.java:150)

话说, 聚合的时候才能有if else吧?

@wendal 是的。。。 正则表达式不聚合是可以用的。。根据官网的json试了下,不是很成功啊。。

你写的是js写法

List<User> userList = userService.query(ZMoDoc.NEW("{'name':'/o/i'}"));

要用java的写法

List<User> userList = userService.query(ZMoDoc.NEW("'name': {$regex : '^wendal$' }"));

@wendal 尝试了一下

List<User> userList = userService.query(ZMoDoc.NEW("{name:{$regex:'O'}}"));

日志打印

User [id=1, name=OK, age=15]

当写成下面代码时,则查不出数据

List<User> userList = userService.query(ZMoDoc.NEW("{name:{$regex:'^O$'}}"));

日志为空

因为不匹配啊...

^O$    // 代表仅含有O

你要查的是包含O是不? 且不区分大小写

name: {$regex:'O',$Option:"$i"}

@wendal SOGA,哈哈哈。聚合的时候的操作应该如何使用啊。
因为现在项目好几个程序都在用nutz,又准备换mongodb,所以得搞清楚,哈哈哈。。

co.aggregate(Arrays.asList(ZMoDoc.NEW(...), ZMoDoc.NEW(...), ZMoDoc.NEW(...), ZMoDoc.NEW(...));

@wendal The method aggregate(List) in the type ZMoCo is not applicable for the arguments (List)

方法参数不对

泛型

List<DBObject> list = ...;
list.add...;
co.aggregate(list);

@wendal 试了一下可以了,代码如下

public List<User> aggregate() {
		List<User> list = new ArrayList<User>();
		AggregationOutput op = zMoCo.aggregate(Arrays.asList(ZMoDoc.NEW("$project",
				ZMoDoc.NEW("age", ZMoDoc.NEW("$cond: { if: { $gte: [ \"$age\", 2 ] }, then: 30, else: 20 }")))
				.getDBobj()));
		Iterator<DBObject> it = op.results().iterator();
		while (it.hasNext()) {
			DBObject obj = it.next();
			list.add(ZMo.me().fromDocToObj(obj, User.class));
		}
		return list;
	}
        List<User> userList = userService.aggregate();
		for (User user2 : userList) {
			System.out.println(user2.toString());
		}

日志输出

User [id=null, name=null, age=30]
User [id=null, name=null, age=20]
添加回复
请先登陆
回到顶部